diff --git a/.gitignore b/.gitignore index 47dfeb723..51328a2d2 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ /log/ /pkg/ **/results/ +!gems/kettle-jem/benchmarks/results/ +!gems/kettle-jem/benchmarks/results/README.md /tmp/ /vendor/bundle/ .env.local diff --git a/.kettle-family.yml b/.kettle-family.yml index 398693343..0710807e9 100644 --- a/.kettle-family.yml +++ b/.kettle-family.yml @@ -4,6 +4,8 @@ family: members_root: gems members: + exclude: + - "**/benchmarks/**" order: mode: dependency hints: @@ -17,6 +19,7 @@ members: - bash-merge - dotenv-merge - rbs-merge + - html-merge - json-merge - yaml-merge - toml-merge @@ -114,7 +117,7 @@ release: publish_command: bundle exec kettle-release env: GALTZO_FLOSS_DEV: false - KETTLE_RB_DEV: false + KETTLE_DEV_DEV: false STRUCTUREDMERGE_DEV: false TSLP_DEV: "" family_changelog: diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e99e1f9d..551dc1fbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,17 +20,38 @@ Please file a bug if you notice a violation of semantic versioning. ### Added +- `ast-crispr` now provides `Ast::Crispr::DeleteBatch` for deleting matches from + multiple structural selectors through one parsed document context. +- Added `html-merge` as a StructuredMerge Ruby family member with TreeHaver + HTML parsing, feature profile reporting, and an initial ast-crispr-backed HTML + structural edit adapter. - TreeHaver RSpec dependency tags now support parser capability checks, and `ruby-merge` exposes TSLP Ruby capability tags for import records, top-level call records, and namespace-form equivalence. +- `kettle-jem` benchmark results now include README timing breakdowns for both + the baseline and fastest non-baseline variant. ### Changed +- `kettle-jem` now migrates existing SimpleCov bootstrap files for packaged + monorepo subgems even when the selected template profile does not otherwise + manage per-gem harness files. - `kettle-jem` RuboCop guidance now treats `.rubocop_gradual.lock` as a work list rather than a baseline, and documents explicit config and inline exceptions for intentional style deviations. - Current CI now detects changed monorepo gems and runs each changed gem's own `kettle-test` suite instead of installing the root aggregate bundle. +- `kettle-jem` templating now defaults no-option runs to classified thread + planning and file work with half of the available CPU cores. +- `kettle-jem` Ractor-backed file work now batches file units by worker count + instead of spawning one Ractor per file. +- `kettle-jem` README processing now reuses structural owner scans and batches + several Markdown deletions to reduce repeated parser passes. +- `kettle-jem` main Gemfile templating now removes repeated direct sibling + execution blocks left behind by older `nomono` bootstrap output while applying + the simplified `require "nomono/bundler"` loader. +- `smorg-rb` diff-driver output now appends a unified review hunk with exact + removed and added source text after the semantic structured-diff summary. - Retemplated generated project metadata, support documentation, CI workflows, binstubs, and development dependency floors across the StructuredMerge Ruby gem family with `kettle-jem` v7.0.0. @@ -39,12 +60,38 @@ Please file a bug if you notice a violation of semantic versioning. on bespoke workspace scripts. - `kettle-jem` gem templates now require `kettle-dev` 2.0.8 or newer. - `ast-merge` now requires `token-resolver` 2.0.1 or newer. -- Gems that use `tree_sitter_language_pack` now resolve it through the - StructuredMerge Ruby 4-compatible fork branch in their development Gemfiles - until an upstream Ruby 4-compatible release is available. +- `ast-merge` now provides shared comment/layout emission helpers for root + boundary text, leading segments, retained blank lines, and equivalent-region + ownership checks, and RBS, Bash, dotenv, and Psych merges now use that common + path where their semantics are format-neutral. Those helpers reuse shared + line-range normalization instead of duplicating owner location handling. +- RBS, Bash, and dotenv removal-mode comment promotion now uses the shared + `ast-merge` removed-owner preservation path for leading segments, trailing + regions, and fallback layout gaps. +- `ast-merge` now provides shared source-region report helpers for comment-block + attachment and blank interstitial ownership, and `ruby-merge` uses those + helpers for its Ruby fixture/report APIs instead of carrying local copies of + format-neutral ownership mechanics. The shared helpers now also cover + interstitial region construction, public owner projection, source spans, + source content slices, and attached leading comment regions. +- `kettle-jem` benchmark runs now support `--only` and + `KETTLE_JEM_BENCHMARK_ONLY` selectors so combined worker variants can be + measured without also running planning-only and file-only split variants. +- Root architecture specs now guard merge emission files against new ad hoc + comment or blank-line ownership scans, keeping the remaining cleanup debt + explicit while shared ast-merge attachment and layout helpers are adopted. +- Development Gemfiles for gems that use `tree_sitter_language_pack` now default + to the StructuredMerge fork branch with the Ruby ABI platform-gem fix until + that fix is released upstream. - Structured merge gems now fail closed when no registered TreeHaver backend is available instead of falling back to direct parser-library paths outside the TreeHaver and ast-merge stack. +- `TreeHaver.parser_for` now accepts backend-type and contract constraints so + substrate gems can request normalized tree-sitter semantics without being + hijacked by parser-specific provider gems registered for the same language. +- `yaml-merge` now routes merge emission through TreeHaver/TSLP-backed AST + owners and ast-merge result mechanics instead of canonicalizing merged YAML + through Ruby object rendering. ### Deprecated @@ -55,6 +102,41 @@ Please file a bug if you notice a violation of semantic versioning. ### Fixed +- TreeHaver now smoke-tests `tree_sitter_language_pack` parser execution for the + requested language before registering the TSLP backend, so broken native gem + artifacts fail closed with a useful reason instead of surfacing parser + self-conversion `TypeError`s during JSON merges. +- `json-merge` file analysis now registers its TreeHaver JSON backend before + direct parsing, preventing templating from failing with `No parser registered + for json` when JSON smart merges instantiate file analysis directly. +- RBS recursive member merges no longer duplicate destination-owned comments + before matched nested declarations across repeated templating runs. +- RBS merges now preserve retained declaration and nested member blank-line + gaps, preventing templating from compacting existing `.rbs` whitespace. +- Bash merges now preserve floating first-owner and removed-node comment gaps, + and avoid duplicating a comment block that was already promoted from a removed + destination-only node. +- Bash and RBS removal-mode merges no longer duplicate a blank gap when a + removed destination-only owner preserves the same gap later seen as a retained + matched owner's leading gap. +- Bash, dotenv, and RBS merges now share a retained blank-gap compliance + contract and preserve destination-owned blank gaps between retained matched + owners, including template-preferred matched output. +- RBS recursive member merges now use a shared retained blank-gap contract and + preserve destination-owned nested member separators when template-preferred + member bodies are emitted. +- TOML template-preferred merges now preserve destination-owned retained blank + gaps for matched top-level keys and keys inside matched tables. +- JSON template-preferred merges now preserve destination-owned retained blank + gaps for matched top-level and nested object pairs. +- Ruby merges now preserve destination-owned retained blank gaps between matched + top-level declarations when emitting TSLP-backed merge results. +- YAML merges now preserve comments, blank lines, anchors, aliases, + multi-document separators, and scalar spelling for the shared formatting + preservation fixture while retaining destination-owned sequence values. +- Markdown backend feature fixtures now account for optional provider backends + that are only available after their provider gems register concrete TreeHaver + integrations in the current process. - Ast-merge changed-gem CI no longer times out or fails when exercising isolated fixture integrations that require Prism-backed Ruby merging. - Changed-gem CI suites now pass in isolated gem bundles by loading required @@ -65,6 +147,9 @@ Please file a bug if you notice a violation of semantic versioning. template-only direct methods during scoped intra-owner declaration merges. - TreeHaver now normalizes nested object fields from tree-sitter-language-pack process results, including span objects, before building parser analysis. +- `bash-merge` now routes explicit `parser_path:` overrides through scoped + TreeHaver language registration instead of passing parser library paths + directly to parser construction. - Byte-offset rewrites in `kettle-jem` and `prism-merge` now splice source with byte-aware slicing so non-ASCII content before an edited AST node does not @@ -82,7 +167,7 @@ Please file a bug if you notice a violation of semantic versioning. - `kettle-jem` JRuby 9.4 workflow templates now install RubyGems 3.6.9 and Bundler 2.6.9 instead of using the default JRuby toolchain. - Local template stack reinstalls now uninstall the selected StructuredMerge Ruby - gems before reinstalling them, and no longer install sibling `kettle-rb` or + gems before reinstalling them, and no longer install sibling `kettle-dev` or `galtzo-floss` gems by default. - Ruby merges now place template-only top-level nodes at their template anchor by default instead of appending them to the destination tail. @@ -102,6 +187,10 @@ Please file a bug if you notice a violation of semantic versioning. raising during recursive merge policy checks. - `kettle-jem` now normalizes GitHub Actions pins for all existing workflow files after templating, including workflows outside the active recipe set. +- `kettle-jem install` now completes raw `bundle gem` skeleton bootstrap by + generating the modular Gemfiles required by the generated Gemfile before + running setup, and skips RuboCop Gradual autocorrect when the destination does + not define that task. ### Security diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 581f09b2f..1c039b23f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -116,7 +116,7 @@ Troubleshooting Git diffs - Use `git diff --no-ext-diff` to compare against Git's built-in diff output. - Use `git diff --no-textconv` when a textconv projection obscures the raw file bytes you need to inspect. - If Git reports a missing `smorg-*` executable, rerun `bundle install` and the setup command above, then check `git config --local --get-regexp '^diff\.smorg-'`. -- To remove managed local entries, run `K_JEM_TEMPLATING=true kettle-jem install --undo`; remove global command registrations with `git config --global --unset-all diff.smorg-ruby.command`. +- To remove managed local entries, run `K_JEM_TEMPLATING=true kettle-jem install --undo`; remove global command registrations with `git config --global --unset-all diff.smorg-rb.command`. For a quick starting point, this repository’s `mise.toml` defines the shared defaults, and `.env.local` can override them locally. Copy `.env.local.example` to `.env.local`, use `KEY=value` lines, and either activate `mise` in your shell or run commands through `mise exec -C /path/to/project -- ...`. diff --git a/Gemfile b/Gemfile index 26178427d..0fc912c07 100644 --- a/Gemfile +++ b/Gemfile @@ -1,26 +1,17 @@ -kettle_rb_dev = ENV.fetch("KETTLE_RB_DEV", "false") +kettle_dev_dev = ENV.fetch("KETTLE_DEV_DEV", "false") source "https://rubygems.org" -tslp_dev = ENV.fetch("TSLP_DEV", nil) -if tslp_dev.to_s.empty? - gem( - "tree_sitter_language_pack", - git: "https://github.com/structuredmerge/tree-sitter-language-pack.git", - branch: "fix/ruby-parser-api-methods", - glob: "packages/ruby/*.gemspec", - ) -else - gem "tree_sitter_language_pack", path: tslp_dev -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem "tree_sitter_language_pack", "~> 1.13", ">= 1.13.3" -unless kettle_rb_dev.casecmp("false").zero? +unless kettle_dev_dev.casecmp("false").zero? require "nomono/bundler" eval_nomono_gems( gems: %w[kettle-dev kettle-family kettle-test], - prefix: "KETTLE_RB", - path_env: "KETTLE_RB_DEV", + prefix: "KETTLE_DEV", + path_env: "KETTLE_DEV_DEV", vendored_gems_env: "VENDORED_GEMS", vendor_gem_dir_env: "VENDOR_GEM_DIR", debug_env: "KETTLE_DEV_DEBUG", @@ -79,10 +70,10 @@ gem "appraisal2", "~> 3.1", ">= 3.1.1" gem "bundler-audit", "~> 0.9.3" -if kettle_rb_dev.casecmp("false").zero? +if kettle_dev_dev.casecmp("false").zero? gem "kettle-dev", "~> 2.2", ">= 2.2.25" - gem "kettle-family", ">= 1.0.0" + gem "kettle-family", ">= 1.0.4" gem "kettle-test", "~> 2.0", ">= 2.0.11" end diff --git a/Gemfile.lock b/Gemfile.lock index 39c4925de..a2d4cfaff 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,13 +1,3 @@ -GIT - remote: https://github.com/structuredmerge/tree-sitter-language-pack.git - revision: 85cac7836bb2f8cfcd3041a191b7bd11bf10924a - branch: fix/ruby-parser-api-methods - glob: packages/ruby/*.gemspec - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - PATH remote: gems/ast-crispr-markdown-markly specs: @@ -228,6 +218,7 @@ PATH smorg-rb (7.1.0) ast-merge (= 7.1.0) ast-merge-git (= 7.1.0) + diff-lcs (~> 1.5) go-merge (= 7.1.0) json-merge (= 7.1.0) kettle-jem (= 7.1.0) @@ -249,7 +240,7 @@ PATH tree_haver (7.1.0) citrus (~> 3.0) parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) version_gem (~> 1.1, >= 1.1.9) PATH @@ -305,25 +296,25 @@ GEM diff-lcs (1.6.2) docopt_ng (0.7.1) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gitmoji-regex (2.0.4) version_gem (~> 1.1, >= 1.1.13) io-console (0.8.2) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-family (1.0.0) + kettle-drift (1.0.6) + version_gem (~> 1.1, >= 1.1.14) + kettle-family (1.0.4) command_kit (~> 0.6) command_kit-completion (~> 0.1) kettle-dev (~> 2.3, >= 2.3.4) kettle-test (~> 2.0, >= 2.0.10) tsort (~> 0.2) - kettle-rb (0.1.4) - kettle-test (2.0.11) + kettle-rb (0.1.5) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -350,9 +341,6 @@ GEM public_suffix (7.0.5) racc (1.8.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -391,7 +379,7 @@ GEM silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - sorbet-runtime (0.6.13342) + sorbet-runtime (0.6.13351) stone_checksums (1.0.6) version_gem (~> 1.1, >= 1.1.13) thor (1.5.0) @@ -400,14 +388,16 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) + version_gem (~> 1.1, >= 1.1.14) toml (0.3.0) parslet (>= 1.8.0, < 3.0.0) toml-rb (4.2.0) citrus (~> 3.0, > 3.0) racc (~> 1.7) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -439,7 +429,7 @@ DEPENDENCIES json-merge! kettle-dev (~> 2.2, ~> 2.0, >= 2.2.25) kettle-drift (~> 1.0, >= 1.0.5) - kettle-family (>= 1.0.0) + kettle-family (>= 1.0.4) kettle-jem! kettle-test (~> 2.0, >= 2.0.9, >= 2.0.11) kramdown-merge! @@ -463,7 +453,7 @@ DEPENDENCIES toml-merge! toml-rb (~> 4.1) tree_haver! - tree_sitter_language_pack! + tree_sitter_language_pack (~> 1.13, >= 1.13.3) turbo_tests2 (~> 3.2, ~> 3.1, >= 3.2.0, >= 3.1.14) typescript-merge! yaml-merge! @@ -482,6 +472,7 @@ CHECKSUMS bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 citrus-toml-merge (7.1.0) @@ -497,17 +488,17 @@ CHECKSUMS docopt_ng (0.7.1) sha256=a024148ee4fa3ab1a8a04411aa4370f39cf2b446e63562097d418b7974a15667 dotenv-merge (7.1.0) emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f go-merge (7.1.0) io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-family (1.0.0) sha256=4c1c158fede8c4e369b6e5576cb540ad38891011cfc7721aea0ade813b13e3c1 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-drift (1.0.6) sha256=46eda08fa4411d1f3c6682a95eef1c9df4e94611b3949f49d4c7b43c0ed356a3 + kettle-family (1.0.4) sha256=bd6d111e997ae07f531c553f86dfd3c8f31eb37d4b3eefaef65655f7d6bc6c51 kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa kramdown-merge (7.1.0) logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 @@ -526,8 +517,6 @@ CHECKSUMS public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 rbs-merge (7.1.0) reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835 @@ -550,17 +539,17 @@ CHECKSUMS service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 toml-merge (7.1.0) toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 typescript-merge (7.1.0) @@ -570,4 +559,4 @@ CHECKSUMS zip-merge (7.1.0) BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/README.md b/README.md index 8ced3bea3..c4a6f16dd 100644 --- a/README.md +++ b/README.md @@ -275,10 +275,10 @@ Provider and recipe gems: ## Portability -The Ruby gems are developed against the shared StructuredMerge fixtures. Those -fixtures define the cross-language behavior expected from the Go, TypeScript, -Rust, and Ruby implementations. Conformance checks live in gem specs and in the -shared spec/fixture tooling rather than in a static status document. +The Ruby gems are developed against the [shared StructuredMerge fixtures][structuredmerge-fixtures]. +Those fixtures define the cross-language behavior expected from the Go, +TypeScript, Rust, and Ruby implementations. Conformance checks live in gem specs +and in the shared spec/fixture tooling rather than in a static status document. ## Development diff --git a/gems/ast-crispr-markdown-markly/.kettle-drift.lock b/gems/ast-crispr-markdown-markly/.kettle-drift.lock deleted file mode 100644 index 09df60df7..000000000 --- a/gems/ast-crispr-markdown-markly/.kettle-drift.lock +++ /dev/null @@ -1,317 +0,0 @@ -{ - "(direct_sibling_local ||\nENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)": [ - { - "file": "Gemfile", - "lines": [ - 80, - 120, - 160, - 200, - 240, - 280, - 320, - 360 - ] - } - ], - ".find { |spec| spec.name == 'nomono' }\nnomono_locked = nomono_locked_spec &&": [ - { - "file": "Gemfile", - "lines": [ - 91, - 131, - 171, - 211, - 251, - 291, - 331, - 371 - ] - } - ], - "ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)\ndirect_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')": [ - { - "file": "Gemfile", - "lines": [ - 81, - 121, - 161, - 201, - 241, - 281, - 321, - 361 - ] - } - ], - "Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)\nnomono_activation_requirements = [\"= #{nomono_locked_spec.version}\"] if nomono_locked": [ - { - "file": "Gemfile", - "lines": [ - 93, - 133, - 173, - 213, - 253, - 293, - 333, - 373 - ] - } - ], - "Kernel.send(:gem, 'nomono', *nomono_activation_requirements)\nrequire 'nomono/bundler'": [ - { - "file": "Gemfile", - "lines": [ - 96, - 136, - 176, - 216, - 256, - 296, - 336, - 376 - ] - } - ], - "direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')\ndirect_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)": [ - { - "file": "Gemfile", - "lines": [ - 82, - 122, - 162, - 202, - 242, - 282, - 322, - 362 - ] - } - ], - "eval_nomono_gems(\ngems: direct_sibling_gems,": [ - { - "file": "Gemfile", - "lines": [ - 60, - 100, - 140, - 180, - 220, - 260, - 300, - 340, - 380 - ] - } - ], - "gems: direct_sibling_gems,\nprefix: 'STRUCTUREDMERGE',": [ - { - "file": "Gemfile", - "lines": [ - 101, - 141, - 181, - 221, - 261, - 301, - 341, - 381 - ] - } - ], - "if File.file?(nomono_lockfile)\nnomono_locked_spec = Bundler::LockfileParser": [ - { - "file": "Gemfile", - "lines": [ - 43, - 87, - 127, - 167, - 207, - 247, - 287, - 327, - 367 - ] - } - ], - "if direct_sibling_dev_was_set\nENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original": [ - { - "file": "Gemfile", - "lines": [ - 110, - 150, - 190, - 230, - 270, - 310, - 350, - 390 - ] - } - ], - "if direct_sibling_gems.any? &&\n(direct_sibling_local ||": [ - { - "file": "Gemfile", - "lines": [ - 35, - 79, - 119, - 159, - 199, - 239, - 279, - 319, - 359 - ] - } - ], - "if direct_sibling_templating && !direct_sibling_local\nif direct_sibling_dev_was_set": [ - { - "file": "Gemfile", - "lines": [ - 69, - 109, - 149, - 189, - 229, - 269, - 309, - 349, - 389 - ] - } - ], - "nomono_activation_requirements = nomono_requirements\nnomono_lockfile = File.expand_path('Gemfile.lock', __dir__)": [ - { - "file": "Gemfile", - "lines": [ - 85, - 125, - 165, - 205, - 245, - 285, - 325, - 365 - ] - } - ], - "nomono_locked = nomono_locked_spec &&\nGem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)": [ - { - "file": "Gemfile", - "lines": [ - 48, - 92, - 132, - 172, - 212, - 252, - 292, - 332, - 372 - ] - } - ], - "nomono_locked_spec = Bundler::LockfileParser\n.new(Bundler.read_file(nomono_lockfile))": [ - { - "file": "Gemfile", - "lines": [ - 44, - 88, - 128, - 168, - 208, - 248, - 288, - 328, - 368 - ] - } - ], - "nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)\nif File.file?(nomono_lockfile)": [ - { - "file": "Gemfile", - "lines": [ - 86, - 126, - 166, - 206, - 246, - 286, - 326, - 366 - ] - } - ], - "path_env: 'STRUCTUREDMERGE_DEV',\nroot: %w[src my structuredmerge]": [ - { - "file": "Gemfile", - "lines": [ - 103, - 143, - 183, - 223, - 263, - 303, - 343, - 383 - ] - } - ], - "prefix: 'STRUCTUREDMERGE',\npath_env: 'STRUCTUREDMERGE_DEV',": [ - { - "file": "Gemfile", - "lines": [ - 102, - 142, - 182, - 222, - 262, - 302, - 342, - 382 - ] - } - ], - "require 'nomono/bundler'\nENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local": [ - { - "file": "Gemfile", - "lines": [ - 97, - 137, - 177, - 217, - 257, - 297, - 337, - 377 - ] - } - ], - "rescue LoadError\nwarn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'": [ - { - "file": "Gemfile", - "lines": [ - 106, - 146, - 186, - 226, - 266, - 306, - 346, - 386 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 - ] - } - ] -} diff --git a/gems/ast-crispr-markdown-markly/.rubocop_gradual.lock b/gems/ast-crispr-markdown-markly/.rubocop_gradual.lock index 67ec8026a..5624f80ed 100644 --- a/gems/ast-crispr-markdown-markly/.rubocop_gradual.lock +++ b/gems/ast-crispr-markdown-markly/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:971555246": [ + ".simplecov:2930391605": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:4085821453": [ @@ -21,13 +21,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -63,6 +70,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -72,64 +86,47 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], "lib/ast-crispr-markdown-markly.rb:374208510": [ [1, 1, 0, "Naming/FileName: The name of this source file (`ast-crispr-markdown-markly.rb`) should use snake_case.", 5381] ], - "lib/ast/crispr/markdown/markly.rb:2564514831": [ + "lib/ast/crispr/markdown/markly.rb:1124197915": [ [11, 7, 13, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::Markdown::Markly`.", 95841343], [14, 9, 13, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Markdown::Markly::Adapter`.", 2579377404], - [14, 9, 13970, "Metrics/ClassLength: Class has too many lines. [335/100]", 429557235], - [64, 11, 700, "Metrics/MethodLength: Method has too many lines. [15/10]", 196504356], - [90, 13, 87, "Style/RaiseArgs: Provide an exception class and message as arguments to `raise`.", 1878059440], - [93, 11, 1781, "Metrics/MethodLength: Method has too many lines. [39/10]", 2020253431], - [137, 11, 739, "Metrics/AbcSize: Assignment Branch Condition size for `build_heading_sections` is too high. [<5, 16, 3> 17.03/17]", 3186655060], - [137, 11, 739, "Metrics/MethodLength: Method has too many lines. [14/10]", 3186655060], - [156, 11, 915, "Metrics/AbcSize: Assignment Branch Condition size for `build_link_definitions` is too high. [<2, 19, 7> 20.35/17]", 2943708156], - [156, 11, 915, "Metrics/MethodLength: Method has too many lines. [18/10]", 2943708156], - [195, 11, 1750, "Metrics/AbcSize: Assignment Branch Condition size for `build_table_rows` is too high. [<16, 44, 17> 49.81/17]", 3931509409], - [195, 11, 1750, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `build_table_rows` is too high. [16/7]", 3931509409], - [195, 11, 1750, "Metrics/MethodLength: Method has too many lines. [34/10]", 3931509409], - [195, 11, 1750, "Metrics/PerceivedComplexity: Perceived complexity for `build_table_rows` is too high. [16/8]", 3931509409], - [253, 11, 768, "Metrics/MethodLength: Method has too many lines. [14/10]", 737914131], - [297, 11, 622, "Metrics/MethodLength: Method has too many lines. [18/10]", 1706283245], - [320, 11, 717, "Metrics/MethodLength: Method has too many lines. [15/10]", 1919892283], - [341, 11, 977, "Metrics/AbcSize: Assignment Branch Condition size for `inline_link_reference_at` is too high. [<6, 17, 11> 21.12/17]", 2987695093], - [341, 11, 977, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `inline_link_reference_at` is too high. [8/7]", 2987695093], - [341, 11, 977, "Metrics/MethodLength: Method has too many lines. [19/10]", 2987695093], - [366, 37, 83, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 2884863618], - [379, 11, 404, "Metrics/MethodLength: Method has too many lines. [13/10]", 427422621], - [396, 9, 16, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::Markdown::Markly::Selectors`.", 2133324825], - [396, 9, 8840, "Metrics/ModuleLength: Module has too many lines. [186/100]", 1134016796], - [399, 11, 1452, "Metrics/AbcSize: Assignment Branch Condition size for `heading_section` is too high. [<2, 21, 7> 22.23/17]", 1578141243], - [399, 11, 1452, "Metrics/MethodLength: Method has too many lines. [30/10]", 1578141243], - [399, 30, 73, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 515735878], - [433, 11, 1397, "Metrics/AbcSize: Assignment Branch Condition size for `link_definition` is too high. [<2, 22, 8> 23.49/17]", 2035221200], - [433, 11, 1397, "Metrics/MethodLength: Method has too many lines. [29/10]", 2035221200], - [433, 30, 68, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 2927391196], - [466, 11, 1236, "Metrics/MethodLength: Method has too many lines. [27/10]", 2705412671], - [497, 11, 1632, "Metrics/AbcSize: Assignment Branch Condition size for `inline_reference` is too high. [<2, 25, 7> 26.04/17]", 2822954343], - [497, 11, 1632, "Metrics/MethodLength: Method has too many lines. [32/10]", 2822954343], - [497, 31, 79, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 871966347], - [533, 11, 3009, "Metrics/AbcSize: Assignment Branch Condition size for `html_comment_block` is too high. [<14, 43, 23> 50.73/17]", 1757586727], - [533, 11, 3009, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `html_comment_block` is too high. [18/7]", 1757586727], - [533, 11, 3009, "Metrics/MethodLength: Method has too many lines. [56/10]", 1757586727], - [533, 11, 3009, "Metrics/PerceivedComplexity: Perceived complexity for `html_comment_block` is too high. [18/8]", 1757586727], - [533, 33, 148, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 4247948333], - [545, 23, 2311, "Metrics/BlockLength: Block has too many lines. [43/25]", 3166751632], - [550, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 236074548] - ], - "spec/ast/crispr/markdown/markly_spec.rb:4192197438": [ - [3, 1, 13013, "Metrics/BlockLength: Block has too many lines. [238/25]", 467937705], - [28, 3, 10302, "Metrics/BlockLength: Block has too many lines. [182/25]", 3591393606], - [132, 121, 33, "Layout/LineLength: Line is too long. [153/120]", 2063489827], - [134, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 2916348790], + [23, 11, 695, "Metrics/MethodLength: Method has too many lines. [15/10]", 2384506812], + [49, 13, 87, "Style/RaiseArgs: Provide an exception class and message as arguments to `raise`.", 1878059440], + [52, 11, 1781, "Metrics/MethodLength: Method has too many lines. [39/10]", 2020253431], + [95, 9, 16, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::Markdown::Markly::Selectors`.", 2133324825], + [95, 9, 8840, "Metrics/ModuleLength: Module has too many lines. [186/100]", 1134016796], + [98, 11, 1452, "Metrics/AbcSize: Assignment Branch Condition size for `heading_section` is too high. [<2, 21, 7> 22.23/17]", 1578141243], + [98, 11, 1452, "Metrics/MethodLength: Method has too many lines. [30/10]", 1578141243], + [98, 30, 73, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 515735878], + [132, 11, 1397, "Metrics/AbcSize: Assignment Branch Condition size for `link_definition` is too high. [<2, 22, 8> 23.49/17]", 2035221200], + [132, 11, 1397, "Metrics/MethodLength: Method has too many lines. [29/10]", 2035221200], + [132, 30, 68, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 2927391196], + [165, 11, 1236, "Metrics/MethodLength: Method has too many lines. [27/10]", 2705412671], + [196, 11, 1632, "Metrics/AbcSize: Assignment Branch Condition size for `inline_reference` is too high. [<2, 25, 7> 26.04/17]", 2822954343], + [196, 11, 1632, "Metrics/MethodLength: Method has too many lines. [32/10]", 2822954343], + [196, 31, 79, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 871966347], + [232, 11, 3009, "Metrics/AbcSize: Assignment Branch Condition size for `html_comment_block` is too high. [<14, 43, 23> 50.73/17]", 1757586727], + [232, 11, 3009, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `html_comment_block` is too high. [18/7]", 1757586727], + [232, 11, 3009, "Metrics/MethodLength: Method has too many lines. [56/10]", 1757586727], + [232, 11, 3009, "Metrics/PerceivedComplexity: Perceived complexity for `html_comment_block` is too high. [18/8]", 1757586727], + [232, 33, 148, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 4247948333], + [244, 23, 2311, "Metrics/BlockLength: Block has too many lines. [43/25]", 3166751632], + [249, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 236074548] + ], + "spec/ast/crispr/markdown/markly_spec.rb:479377118": [ + [3, 1, 13025, "Metrics/BlockLength: Block has too many lines. [238/25]", 467937705], + [28, 3, 10314, "Metrics/BlockLength: Block has too many lines. [182/25]", 3591393606], + [132, 121, 35, "Layout/LineLength: Line is too long. [155/120]", 2413317061], + [134, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 3021964175], [152, 121, 37, "Layout/LineLength: Line is too long. [157/120]", 3082451518], [154, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 3021964175], [267, 3, 1687, "Metrics/BlockLength: Block has too many lines. [33/25]", 4221412326] diff --git a/gems/ast-crispr-markdown-markly/.simplecov b/gems/ast-crispr-markdown-markly/.simplecov index 4321d8879..da2d4d8b2 100644 --- a/gems/ast-crispr-markdown-markly/.simplecov +++ b/gems/ast-crispr-markdown-markly/.simplecov @@ -4,15 +4,11 @@ # ast-crispr-markdown-markly will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/ast-crispr-markdown-markly/.structuredmerge/kettle-jem.yml b/gems/ast-crispr-markdown-markly/.structuredmerge/kettle-jem.yml index 2880a0c69..e93b16bb5 100644 --- a/gems/ast-crispr-markdown-markly/.structuredmerge/kettle-jem.yml +++ b/gems/ast-crispr-markdown-markly/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/ast/crispr/markdown/markly/version.rb - source: sig/gem.rbs diff --git a/gems/ast-crispr-markdown-markly/Gemfile b/gems/ast-crispr-markdown-markly/Gemfile index 86b7488a2..dfcb2477c 100644 --- a/gems/ast-crispr-markdown-markly/Gemfile +++ b/gems/ast-crispr-markdown-markly/Gemfile @@ -37,300 +37,8 @@ if direct_sibling_gems.any? && ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) + require 'nomono/bundler' begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( @@ -339,8 +47,6 @@ if direct_sibling_gems.any? && path_env: 'STRUCTUREDMERGE_DEV', root: %w[src my structuredmerge] ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -352,62 +58,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -415,7 +67,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/ast-crispr-markdown-markly/Gemfile.lock b/gems/ast-crispr-markdown-markly/Gemfile.lock index 9e99f39dd..b8f03a0d7 100644 --- a/gems/ast-crispr-markdown-markly/Gemfile.lock +++ b/gems/ast-crispr-markdown-markly/Gemfile.lock @@ -6,272 +6,6 @@ PATH markly-merge (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,22 +16,30 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) + ast-crispr (7.1.0) + ast-merge (= 7.1.0) + service_actor (~> 3.9) + version_gem (~> 1.1, >= 1.1.9) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +47,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +77,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +96,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +120,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,21 +129,19 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) + markdown-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) markly (0.16.0) + markly-merge (7.1.0) + markdown-merge (= 7.1.0) + markly (~> 0.9) + version_gem (~> 1.1, >= 1.1.9) mutex_m (0.3.0) - nokogiri (1.19.4-aarch64-linux-gnu) - racc (~> 1.4) - nokogiri (1.19.4-aarch64-linux-musl) - racc (~> 1.4) - nokogiri (1.19.4-arm64-darwin) - racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.19.4-x86_64-linux-musl) - racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +162,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +217,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +232,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +271,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -535,23 +297,19 @@ GEM silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +322,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +345,16 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +364,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -624,120 +391,78 @@ GEM zlib (3.2.3) PLATFORMS - aarch64-linux - aarch64-linux-gnu - aarch64-linux-musl - arm64-darwin - x86_64-darwin + x86_64-linux x86_64-linux-gnu - x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.0, >= 3.0.6) - ast-crispr! + appraisal2-rubocop (~> 1.0, >= 1.0.0) ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! - ast-template! - bash-merge! benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! - commonmarker-merge! + cgi (~> 0.5) debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.0) - go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.0, >= 2.2.25) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) + kettle-soup-cover (~> 3.0, >= 3.0.3) kettle-test (~> 2.0, >= 2.0.9) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) + standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.3) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + tree_sitter_language_pack (~> 1.13, >= 1.13.3) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 ast-crispr (7.1.0) ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -746,24 +471,20 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 - json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 @@ -772,35 +493,23 @@ CHECKSUMS markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 - nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f - nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af - nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a - nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -818,35 +527,38 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -855,20 +567,16 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -876,8 +584,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/ast-crispr-markdown-markly/LICENSE.md b/gems/ast-crispr-markdown-markly/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/ast-crispr-markdown-markly/LICENSE.md +++ b/gems/ast-crispr-markdown-markly/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/ast-crispr-markdown-markly/README.md b/gems/ast-crispr-markdown-markly/README.md index 6e7bc7285..4da7d7abc 100644 --- a/gems/ast-crispr-markdown-markly/README.md +++ b/gems/ast-crispr-markdown-markly/README.md @@ -36,8 +36,8 @@ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-ta | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -176,7 +176,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -202,6 +202,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-crispr-markdown-markly [⛳️namespace-img]: https://img.shields.io/badge/namespace-Ast::Crispr::Markdown::Markly-3C2D2D.svg?style=square&logo=ruby&logoColor=white @@ -246,7 +248,7 @@ If none of the available licenses suit your use case, please [contact us](mailto [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/ast-crispr-markdown-markly [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/ast-crispr-markdown-markly -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-crispr-markdown-markly [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/cgi/vHEAD.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/coverage.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/coverage.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/coverage_local.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/coverage_local.gemfile index b8907c400..f7d539edd 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/coverage_local.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[ast-crispr-markdown-markly] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/documentation.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/documentation.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/documentation_local.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..18152b19b 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/documentation_local.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-crispr-markdown-markly] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/optional.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/optional.gemfile index 942b2a369..9ea429538 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/optional.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-crispr-markdown-markly templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/runtime_heads.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/runtime_heads.gemfile index 00205cc5f..ebf17c529 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/runtime_heads.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-crispr-markdown-markly templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/style.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/style.gemfile index 58fdd6d59..4dbcc02c0 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/style.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during ast-crispr-markdown-markly templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/style_local.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/style_local.gemfile index ce75bbe21..e46481c22 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/style_local.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-crispr-markdown-markly] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/templating.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/templating.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/templating_local.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/templating_local.gemfile index d2e0871f3..e9e55ce10 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/templating_local.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-crispr-markdown-markly] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-crispr-markdown-markly] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[ast-crispr-markdown-markly] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/webrick/vHEAD.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/ast-crispr-markdown-markly/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/ast-crispr-markdown-markly/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/ast-crispr-markdown-markly/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/ast-crispr-markdown-markly/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/ast-crispr-markdown-markly/lib/ast/crispr/markdown/markly.rb b/gems/ast-crispr-markdown-markly/lib/ast/crispr/markdown/markly.rb index ec5dbc6a9..6116514df 100644 --- a/gems/ast-crispr-markdown-markly/lib/ast/crispr/markdown/markly.rb +++ b/gems/ast-crispr-markdown-markly/lib/ast/crispr/markdown/markly.rb @@ -90,9 +90,6 @@ def structure_profile(owner_scope: :shared_default) raise Ast::Crispr::Error.new('Unsupported CRISPR owner scope', details: { owner_scope: owner_scope }) end end - - private - end module Selectors diff --git a/gems/ast-crispr-markdown-markly/spec/spec_helper.rb b/gems/ast-crispr-markdown-markly/spec/spec_helper.rb index 4173fdcf7..a890c92b2 100644 --- a/gems/ast-crispr-markdown-markly/spec/spec_helper.rb +++ b/gems/ast-crispr-markdown-markly/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/ast-crispr-ruby-prism/.kettle-drift.lock b/gems/ast-crispr-ruby-prism/.kettle-drift.lock deleted file mode 100644 index aa01ca527..000000000 --- a/gems/ast-crispr-ruby-prism/.kettle-drift.lock +++ /dev/null @@ -1,317 +0,0 @@ -{ - "(direct_sibling_local ||\nENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)": [ - { - "file": "Gemfile", - "lines": [ - 79, - 119, - 159, - 199, - 239, - 279, - 319, - 359 - ] - } - ], - ".find { |spec| spec.name == 'nomono' }\nnomono_locked = nomono_locked_spec &&": [ - { - "file": "Gemfile", - "lines": [ - 90, - 130, - 170, - 210, - 250, - 290, - 330, - 370 - ] - } - ], - "ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)\ndirect_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')": [ - { - "file": "Gemfile", - "lines": [ - 80, - 120, - 160, - 200, - 240, - 280, - 320, - 360 - ] - } - ], - "Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)\nnomono_activation_requirements = [\"= #{nomono_locked_spec.version}\"] if nomono_locked": [ - { - "file": "Gemfile", - "lines": [ - 92, - 132, - 172, - 212, - 252, - 292, - 332, - 372 - ] - } - ], - "Kernel.send(:gem, 'nomono', *nomono_activation_requirements)\nrequire 'nomono/bundler'": [ - { - "file": "Gemfile", - "lines": [ - 95, - 135, - 175, - 215, - 255, - 295, - 335, - 375 - ] - } - ], - "direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')\ndirect_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)": [ - { - "file": "Gemfile", - "lines": [ - 81, - 121, - 161, - 201, - 241, - 281, - 321, - 361 - ] - } - ], - "eval_nomono_gems(\ngems: direct_sibling_gems,": [ - { - "file": "Gemfile", - "lines": [ - 59, - 99, - 139, - 179, - 219, - 259, - 299, - 339, - 379 - ] - } - ], - "gems: direct_sibling_gems,\nprefix: 'STRUCTUREDMERGE',": [ - { - "file": "Gemfile", - "lines": [ - 100, - 140, - 180, - 220, - 260, - 300, - 340, - 380 - ] - } - ], - "if File.file?(nomono_lockfile)\nnomono_locked_spec = Bundler::LockfileParser": [ - { - "file": "Gemfile", - "lines": [ - 42, - 86, - 126, - 166, - 206, - 246, - 286, - 326, - 366 - ] - } - ], - "if direct_sibling_dev_was_set\nENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original": [ - { - "file": "Gemfile", - "lines": [ - 109, - 149, - 189, - 229, - 269, - 309, - 349, - 389 - ] - } - ], - "if direct_sibling_gems.any? &&\n(direct_sibling_local ||": [ - { - "file": "Gemfile", - "lines": [ - 34, - 78, - 118, - 158, - 198, - 238, - 278, - 318, - 358 - ] - } - ], - "if direct_sibling_templating && !direct_sibling_local\nif direct_sibling_dev_was_set": [ - { - "file": "Gemfile", - "lines": [ - 68, - 108, - 148, - 188, - 228, - 268, - 308, - 348, - 388 - ] - } - ], - "nomono_activation_requirements = nomono_requirements\nnomono_lockfile = File.expand_path('Gemfile.lock', __dir__)": [ - { - "file": "Gemfile", - "lines": [ - 84, - 124, - 164, - 204, - 244, - 284, - 324, - 364 - ] - } - ], - "nomono_locked = nomono_locked_spec &&\nGem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)": [ - { - "file": "Gemfile", - "lines": [ - 47, - 91, - 131, - 171, - 211, - 251, - 291, - 331, - 371 - ] - } - ], - "nomono_locked_spec = Bundler::LockfileParser\n.new(Bundler.read_file(nomono_lockfile))": [ - { - "file": "Gemfile", - "lines": [ - 43, - 87, - 127, - 167, - 207, - 247, - 287, - 327, - 367 - ] - } - ], - "nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)\nif File.file?(nomono_lockfile)": [ - { - "file": "Gemfile", - "lines": [ - 85, - 125, - 165, - 205, - 245, - 285, - 325, - 365 - ] - } - ], - "path_env: 'STRUCTUREDMERGE_DEV',\nroot: %w[src my structuredmerge]": [ - { - "file": "Gemfile", - "lines": [ - 102, - 142, - 182, - 222, - 262, - 302, - 342, - 382 - ] - } - ], - "prefix: 'STRUCTUREDMERGE',\npath_env: 'STRUCTUREDMERGE_DEV',": [ - { - "file": "Gemfile", - "lines": [ - 101, - 141, - 181, - 221, - 261, - 301, - 341, - 381 - ] - } - ], - "require 'nomono/bundler'\nENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local": [ - { - "file": "Gemfile", - "lines": [ - 96, - 136, - 176, - 216, - 256, - 296, - 336, - 376 - ] - } - ], - "rescue LoadError\nwarn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'": [ - { - "file": "Gemfile", - "lines": [ - 105, - 145, - 185, - 225, - 265, - 305, - 345, - 385 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 - ] - } - ] -} diff --git a/gems/ast-crispr-ruby-prism/.rubocop_gradual.lock b/gems/ast-crispr-ruby-prism/.rubocop_gradual.lock index fb145ae36..768794b33 100644 --- a/gems/ast-crispr-ruby-prism/.rubocop_gradual.lock +++ b/gems/ast-crispr-ruby-prism/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:865688206": [ + ".simplecov:1593094101": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:3255760589": [ @@ -8,7 +8,7 @@ [163, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 1367093088], [166, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 3881946477] ], - "ast-crispr-ruby-prism.gemspec:2503381071": [ + "ast-crispr-ruby-prism.gemspec:640716287": [ [128, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2821357214], [143, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 3888612416], [144, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 981994949], @@ -21,13 +21,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -63,6 +70,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -72,40 +86,38 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], "lib/ast-crispr-ruby-prism.rb:2918105648": [ [1, 1, 0, "Naming/FileName: The name of this source file (`ast-crispr-ruby-prism.rb`) should use snake_case.", 5381] ], - "lib/ast/crispr/ruby/prism.rb:2237214827": [ + "lib/ast/crispr/ruby/prism.rb:1398725874": [ [11, 7, 12, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::Ruby::Prism`.", 2860768938], [14, 9, 12, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::Ruby::Prism::Utils`.", 2857494984], - [42, 9, 13, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Ruby::Prism::Adapter`.", 2579377404], - [63, 11, 854, "Metrics/AbcSize: Assignment Branch Condition size for `comment_regions_for` is too high. [<5, 17, 7> 19.05/17]", 4216699018], - [63, 11, 854, "Metrics/MethodLength: Method has too many lines. [15/10]", 4216699018], - [86, 11, 901, "Metrics/MethodLength: Method has too many lines. [18/10]", 3779252009], - [108, 9, 16, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::Ruby::Prism::Selectors`.", 2133324825], - [124, 11, 640, "Metrics/MethodLength: Method has too many lines. [11/10]", 2463541954], - [124, 41, 180, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 4151508598], - [139, 11, 3285, "Metrics/AbcSize: Assignment Branch Condition size for `comment_line_block` is too high. [<14, 47, 23> 54.17/17]", 880218168], - [139, 11, 3285, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `comment_line_block` is too high. [18/7]", 880218168], - [139, 11, 3285, "Metrics/MethodLength: Method has too many lines. [62/10]", 880218168], - [139, 11, 3285, "Metrics/PerceivedComplexity: Perceived complexity for `comment_line_block` is too high. [18/8]", 880218168], - [139, 33, 148, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 4247948333], - [151, 23, 2581, "Metrics/BlockLength: Block has too many lines. [49/25]", 2576202082] - ], - "spec/ast/crispr/ruby/prism_spec.rb:859649124": [ - [3, 1, 11152, "Metrics/BlockLength: Block has too many lines. [242/25]", 4253230906], - [32, 3, 4284, "Metrics/BlockLength: Block has too many lines. [87/25]", 1755930986], - [186, 3, 4456, "Metrics/BlockLength: Block has too many lines. [98/25]", 451830228], - [205, 5, 1855, "Metrics/BlockLength: Block has too many lines. [42/25]", 3479234350], - [256, 5, 1717, "Metrics/BlockLength: Block has too many lines. [36/25]", 3873040073], - [298, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2088544858], - [299, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2089183955] + [26, 9, 13, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Ruby::Prism::Adapter`.", 2579377404], + [63, 11, 901, "Metrics/MethodLength: Method has too many lines. [18/10]", 3779252009], + [85, 9, 16, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::Ruby::Prism::Selectors`.", 2133324825], + [101, 11, 640, "Metrics/MethodLength: Method has too many lines. [11/10]", 2463541954], + [101, 41, 180, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 4151508598], + [116, 11, 3285, "Metrics/AbcSize: Assignment Branch Condition size for `comment_line_block` is too high. [<14, 47, 23> 54.17/17]", 880218168], + [116, 11, 3285, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `comment_line_block` is too high. [18/7]", 880218168], + [116, 11, 3285, "Metrics/MethodLength: Method has too many lines. [62/10]", 880218168], + [116, 11, 3285, "Metrics/PerceivedComplexity: Perceived complexity for `comment_line_block` is too high. [18/8]", 880218168], + [116, 33, 148, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 4247948333], + [128, 23, 2581, "Metrics/BlockLength: Block has too many lines. [49/25]", 2576202082] + ], + "spec/ast/crispr/ruby/prism_spec.rb:2051561249": [ + [3, 1, 11519, "Metrics/BlockLength: Block has too many lines. [249/25]", 1483165423], + [41, 3, 4284, "Metrics/BlockLength: Block has too many lines. [87/25]", 1755930986], + [195, 3, 4456, "Metrics/BlockLength: Block has too many lines. [98/25]", 451830228], + [214, 5, 1855, "Metrics/BlockLength: Block has too many lines. [42/25]", 3479234350], + [265, 5, 1717, "Metrics/BlockLength: Block has too many lines. [36/25]", 3873040073], + [307, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2088544858], + [308, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2089183955] ] } diff --git a/gems/ast-crispr-ruby-prism/.simplecov b/gems/ast-crispr-ruby-prism/.simplecov index 896dbb45e..1bad9bc37 100644 --- a/gems/ast-crispr-ruby-prism/.simplecov +++ b/gems/ast-crispr-ruby-prism/.simplecov @@ -4,15 +4,11 @@ # ast-crispr-ruby-prism will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/ast-crispr-ruby-prism/.structuredmerge/kettle-jem.yml b/gems/ast-crispr-ruby-prism/.structuredmerge/kettle-jem.yml index 25286add0..670ff2d95 100644 --- a/gems/ast-crispr-ruby-prism/.structuredmerge/kettle-jem.yml +++ b/gems/ast-crispr-ruby-prism/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/ast/crispr/ruby/prism/version.rb - source: sig/gem.rbs diff --git a/gems/ast-crispr-ruby-prism/Gemfile b/gems/ast-crispr-ruby-prism/Gemfile index 43f132f05..66e4af466 100644 --- a/gems/ast-crispr-ruby-prism/Gemfile +++ b/gems/ast-crispr-ruby-prism/Gemfile @@ -25,6 +25,7 @@ gem 'nomono', *nomono_requirements, require: false # ruby >= 2.2 # Direct sibling dependencies (env-switched via STRUCTUREDMERGE_DEV) direct_sibling_gems = %w[ ast-crispr + prism-merge ] direct_sibling_dev = ENV.fetch('STRUCTUREDMERGE_DEV', '') direct_sibling_local = @@ -36,300 +37,8 @@ if direct_sibling_gems.any? && ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) + require 'nomono/bundler' begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( @@ -338,8 +47,6 @@ if direct_sibling_gems.any? && path_env: 'STRUCTUREDMERGE_DEV', root: %w[src my structuredmerge] ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -351,62 +58,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -414,7 +67,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/ast-crispr-ruby-prism/Gemfile.lock b/gems/ast-crispr-ruby-prism/Gemfile.lock index 06a81f5a4..6a9a61958 100644 --- a/gems/ast-crispr-ruby-prism/Gemfile.lock +++ b/gems/ast-crispr-ruby-prism/Gemfile.lock @@ -6,272 +6,6 @@ PATH prism-merge (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,18 +16,30 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) + ast-crispr (7.1.0) + ast-merge (= 7.1.0) + service_actor (~> 3.9) + version_gem (~> 1.1, >= 1.1.9) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -301,7 +47,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -332,7 +77,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -351,24 +96,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -379,6 +120,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -386,13 +129,10 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) mutex_m (0.3.0) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.19.4-x86_64-linux-musl) - racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -406,6 +146,10 @@ GEM prettyprint prettyprint (0.2.0) prism (1.9.0) + prism-merge (7.1.0) + prism (~> 1.6) + ruby-merge (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) psych (5.4.0) date stringio @@ -413,9 +157,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -471,6 +212,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -478,13 +227,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -504,6 +266,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -515,6 +284,10 @@ GEM lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) rubocop-ast (>= 1.44.0, < 2.0) + ruby-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) @@ -523,23 +296,19 @@ GEM silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -552,6 +321,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -569,14 +344,16 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -586,6 +363,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -613,110 +391,76 @@ GEM PLATFORMS x86_64-linux-gnu - x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.0, >= 3.0.6) - ast-crispr! - ast-crispr-markdown-markly! + appraisal2-rubocop (~> 1.0, >= 1.0.0) ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! - ast-template! - bash-merge! benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! - commonmarker-merge! + cgi (~> 0.5) debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.0) - go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.0, >= 2.2.25) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) + kettle-soup-cover (~> 3.0, >= 3.0.3) kettle-test (~> 2.0, >= 2.0.9) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) + standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.3) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + tree_sitter_language_pack (~> 1.13, >= 1.13.3) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -725,57 +469,43 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 - json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 - markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a - nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -793,35 +523,39 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -830,20 +564,16 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -851,8 +581,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/ast-crispr-ruby-prism/LICENSE.md b/gems/ast-crispr-ruby-prism/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/ast-crispr-ruby-prism/LICENSE.md +++ b/gems/ast-crispr-ruby-prism/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/ast-crispr-ruby-prism/README.md b/gems/ast-crispr-ruby-prism/README.md index 044ce4a5c..2c6281a5d 100644 --- a/gems/ast-crispr-ruby-prism/README.md +++ b/gems/ast-crispr-ruby-prism/README.md @@ -35,8 +35,8 @@ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-ta | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -165,7 +165,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -191,6 +191,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-crispr-ruby-prism [⛳️namespace-img]: https://img.shields.io/badge/namespace-Ast::Crispr::Ruby::Prism-3C2D2D.svg?style=square&logo=ruby&logoColor=white @@ -235,7 +237,7 @@ If none of the available licenses suit your use case, please [contact us](mailto [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/ast-crispr-ruby-prism [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/ast-crispr-ruby-prism -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-crispr-ruby-prism [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/cgi/vHEAD.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/coverage.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/coverage.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/coverage_local.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/coverage_local.gemfile index 6863a1b38..1c618d554 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/coverage_local.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[ast-crispr-ruby-prism] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/documentation.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/documentation.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/documentation_local.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..4d4680eb4 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/documentation_local.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-crispr-ruby-prism] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/optional.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/optional.gemfile index 51682c331..9ea429538 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/optional.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-crispr-ruby-prism templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/runtime_heads.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/runtime_heads.gemfile index 1c63f1df0..ebf17c529 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/runtime_heads.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-crispr-ruby-prism templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/style.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/style.gemfile index b5b38fa1f..4dbcc02c0 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/style.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during ast-crispr-ruby-prism templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/style_local.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/style_local.gemfile index ce75bbe21..5eed4e5dc 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/style_local.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-crispr-ruby-prism] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/templating.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/templating.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/templating_local.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/templating_local.gemfile index b5268538e..d961394fd 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/templating_local.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-crispr-ruby-prism] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-crispr-ruby-prism] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[ast-crispr-ruby-prism] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/webrick/vHEAD.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/ast-crispr-ruby-prism/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/ast-crispr-ruby-prism/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/ast-crispr-ruby-prism/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/ast-crispr-ruby-prism/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/ast-crispr-ruby-prism/spec/spec_helper.rb b/gems/ast-crispr-ruby-prism/spec/spec_helper.rb index 65c8fc84b..b0be21944 100644 --- a/gems/ast-crispr-ruby-prism/spec/spec_helper.rb +++ b/gems/ast-crispr-ruby-prism/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/ast-crispr/.kettle-drift.lock b/gems/ast-crispr/.kettle-drift.lock index aa01ca527..25b4603d6 100644 --- a/gems/ast-crispr/.kettle-drift.lock +++ b/gems/ast-crispr/.kettle-drift.lock @@ -5,12 +5,7 @@ "lines": [ 79, 119, - 159, - 199, - 239, - 279, - 319, - 359 + 159 ] } ], @@ -20,12 +15,7 @@ "lines": [ 90, 130, - 170, - 210, - 250, - 290, - 330, - 370 + 170 ] } ], @@ -35,12 +25,7 @@ "lines": [ 80, 120, - 160, - 200, - 240, - 280, - 320, - 360 + 160 ] } ], @@ -50,12 +35,7 @@ "lines": [ 92, 132, - 172, - 212, - 252, - 292, - 332, - 372 + 172 ] } ], @@ -65,12 +45,7 @@ "lines": [ 95, 135, - 175, - 215, - 255, - 295, - 335, - 375 + 175 ] } ], @@ -80,12 +55,7 @@ "lines": [ 81, 121, - 161, - 201, - 241, - 281, - 321, - 361 + 161 ] } ], @@ -96,12 +66,7 @@ 59, 99, 139, - 179, - 219, - 259, - 299, - 339, - 379 + 179 ] } ], @@ -111,12 +76,7 @@ "lines": [ 100, 140, - 180, - 220, - 260, - 300, - 340, - 380 + 180 ] } ], @@ -127,12 +87,7 @@ 42, 86, 126, - 166, - 206, - 246, - 286, - 326, - 366 + 166 ] } ], @@ -142,12 +97,7 @@ "lines": [ 109, 149, - 189, - 229, - 269, - 309, - 349, - 389 + 189 ] } ], @@ -158,12 +108,7 @@ 34, 78, 118, - 158, - 198, - 238, - 278, - 318, - 358 + 158 ] } ], @@ -174,12 +119,7 @@ 68, 108, 148, - 188, - 228, - 268, - 308, - 348, - 388 + 188 ] } ], @@ -189,12 +129,7 @@ "lines": [ 84, 124, - 164, - 204, - 244, - 284, - 324, - 364 + 164 ] } ], @@ -205,12 +140,7 @@ 47, 91, 131, - 171, - 211, - 251, - 291, - 331, - 371 + 171 ] } ], @@ -221,12 +151,7 @@ 43, 87, 127, - 167, - 207, - 247, - 287, - 327, - 367 + 167 ] } ], @@ -236,12 +161,7 @@ "lines": [ 85, 125, - 165, - 205, - 245, - 285, - 325, - 365 + 165 ] } ], @@ -251,12 +171,7 @@ "lines": [ 102, 142, - 182, - 222, - 262, - 302, - 342, - 382 + 182 ] } ], @@ -266,12 +181,7 @@ "lines": [ 101, 141, - 181, - 221, - 261, - 301, - 341, - 381 + 181 ] } ], @@ -281,12 +191,7 @@ "lines": [ 96, 136, - 176, - 216, - 256, - 296, - 336, - 376 + 176 ] } ], @@ -296,21 +201,7 @@ "lines": [ 105, 145, - 185, - 225, - 265, - 305, - 345, - 385 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 + 185 ] } ] diff --git a/gems/ast-crispr/.rubocop_gradual.lock b/gems/ast-crispr/.rubocop_gradual.lock index d920cf89f..613886555 100644 --- a/gems/ast-crispr/.rubocop_gradual.lock +++ b/gems/ast-crispr/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:3928423310": [ + ".simplecov:955928789": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:918344237": [ @@ -21,13 +21,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -63,6 +70,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -72,17 +86,17 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], "lib/ast-crispr.rb:247837913": [ [1, 1, 0, "Naming/FileName: The name of this source file (`ast-crispr.rb`) should use snake_case.", 5381] ], - "lib/ast/crispr.rb:3730230259": [ + "lib/ast/crispr.rb:2551127366": [ [12, 5, 11, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Error`.", 62528179], [22, 5, 11, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Limit`.", 51888158], [47, 7, 622, "Metrics/MethodLength: Method has too many lines. [14/10]", 2816807495], @@ -96,96 +110,93 @@ [124, 5, 11, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Match`.", 52676120], [127, 21, 73, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 344717847], [172, 5, 18, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::MatchProfile`.", 365273299], - [172, 5, 4350, "Metrics/ClassLength: Class has too many lines. [115/100]", 1575766989], + [172, 5, 3799, "Metrics/ClassLength: Class has too many lines. [109/100]", 180580438], [273, 7, 596, "Metrics/MethodLength: Method has too many lines. [14/10]", 2070486858], - [314, 5, 24, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::DestinationProfile`.", 3442102524], - [314, 5, 4581, "Metrics/ClassLength: Class has too many lines. [119/100]", 3503477661], - [352, 21, 126, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 931636409], - [417, 7, 667, "Metrics/MethodLength: Method has too many lines. [15/10]", 4004247638], - [460, 5, 27, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::DestinationResolution`.", 1305107769], - [474, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::StructureProfile`.", 614380405], - [512, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::SelectionProfile`.", 2464089216], - [531, 21, 165, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 1182500333], - [566, 7, 585, "Metrics/MethodLength: Method has too many lines. [13/10]", 13786997], - [583, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::OperationProfile`.", 1974079861], - [607, 21, 188, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 2526147676], - [662, 7, 478, "Metrics/MethodLength: Method has too many lines. [11/10]", 795235914], - [695, 7, 10, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Adapters::Null`.", 3515430288], - [728, 5, 21, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::DocumentContext`.", 594998459], - [788, 5, 19, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::OwnerSelector`.", 3092459999], - [791, 21, 81, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 2293822273], - [853, 7, 606, "Metrics/MethodLength: Method has too many lines. [16/10]", 422136278], - [883, 5, 16, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::Selectors`.", 2133324825], - [883, 5, 5586, "Metrics/ModuleLength: Module has too many lines. [130/100]", 3440946513], - [886, 7, 1642, "Metrics/AbcSize: Assignment Branch Condition size for `owner_filter` is too high. [<6, 18, 11> 21.93/17]", 3224577904], - [886, 7, 1642, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `owner_filter` is too high. [10/7]", 3224577904], - [886, 7, 1642, "Metrics/MethodLength: Method has too many lines. [37/10]", 3224577904], - [886, 7, 1642, "Metrics/PerceivedComplexity: Perceived complexity for `owner_filter` is too high. [11/8]", 3224577904], - [886, 23, 135, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 3231562627], - [930, 7, 1936, "Metrics/AbcSize: Assignment Branch Condition size for `comment_region_owned_owner` is too high. [<7, 16, 7> 18.81/17]", 2629441148], - [930, 7, 1936, "Metrics/MethodLength: Method has too many lines. [40/10]", 2629441148], - [930, 37, 190, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 4159525724], - [931, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 940069302], - [975, 7, 1731, "Metrics/AbcSize: Assignment Branch Condition size for `line_block` is too high. [<12, 22, 14> 28.71/17]", 1307990669], - [975, 7, 1731, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `line_block` is too high. [12/7]", 1307990669], - [975, 7, 1731, "Metrics/MethodLength: Method has too many lines. [38/10]", 1307990669], - [975, 7, 1731, "Metrics/PerceivedComplexity: Perceived complexity for `line_block` is too high. [12/8]", 1307990669], - [975, 21, 130, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 515174999], - [1027, 5, 23, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::OperationSupport`.", 343849029], - [1027, 5, 6491, "Metrics/ModuleLength: Module has too many lines. [139/100]", 2271788056], - [1072, 7, 1758, "Metrics/AbcSize: Assignment Branch Condition size for `insertion_from` is too high. [<5, 21, 11> 24.23/17]", 29011294], - [1072, 7, 1758, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `insertion_from` is too high. [9/7]", 29011294], - [1072, 7, 1758, "Metrics/MethodLength: Method has too many lines. [28/10]", 29011294], - [1072, 7, 1758, "Metrics/PerceivedComplexity: Perceived complexity for `insertion_from` is too high. [10/8]", 29011294], - [1115, 7, 827, "Metrics/AbcSize: Assignment Branch Condition size for `splice_after_anchor` is too high. [<4, 19, 2> 19.52/17]", 14691010], - [1115, 7, 827, "Metrics/MethodLength: Method has too many lines. [16/10]", 14691010], - [1119, 9, 72, "Style/RaiseArgs: Provide an exception class and message as arguments to `raise`.", 789091243], - [1121, 23, 72, "Style/StringConcatenation: Prefer string interpolation to string concatenation.", 2503424841], - [1153, 9, 25, "Style/StringConcatenation: Prefer string interpolation to string concatenation.", 768340433], - [1197, 5, 26, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::OperationProfilable`.", 4114431854], - [1206, 7, 19, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::OperationProfilable::ClassMethods`.", 3606528253], - [1218, 5, 13, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Replace`.", 1563590855], - [1243, 7, 643, "Metrics/AbcSize: Assignment Branch Condition size for `call` is too high. [<10, 32, 3> 33.66/17]", 3656683885], - [1243, 7, 643, "Metrics/MethodLength: Method has too many lines. [14/10]", 3656683885], - [1262, 5, 12, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Delete`.", 2011475922], - [1286, 7, 538, "Metrics/AbcSize: Assignment Branch Condition size for `call` is too high. [<7, 21, 1> 22.16/17]", 2655200768], - [1286, 7, 538, "Metrics/MethodLength: Method has too many lines. [13/10]", 2655200768], - [1304, 5, 12, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Insert`.", 1590185308], - [1338, 5, 10, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Move`.", 3515667002], - [1366, 7, 1182, "Metrics/AbcSize: Assignment Branch Condition size for `call` is too high. [<14, 40, 7> 42.95/17]", 172197360], - [1366, 7, 1182, "Metrics/MethodLength: Method has too many lines. [22/10]", 172197360], - [1383, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 2688172402], - [1396, 3, 13, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr`.", 315644438], - [1396, 3, 12758, "Metrics/ModuleLength: Module has too many lines. [180/100]", 2662313186], - [1397, 5, 33, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::ProfileReportCompatibility`.", 3039519892], - [1419, 5, 18, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::MatchProfile`.", 365273299], - [1431, 7, 28, "Lint/DuplicateMethods: Method `Ast::Crispr::MatchProfile#normalize_start_boundary` is defined at both lib/ast/crispr.rb:292 and lib/ast/crispr.rb:1431.", 2362701855], - [1435, 7, 26, "Lint/DuplicateMethods: Method `Ast::Crispr::MatchProfile#normalize_end_boundary` is defined at both lib/ast/crispr.rb:299 and lib/ast/crispr.rb:1435.", 2613594544], - [1439, 7, 26, "Lint/DuplicateMethods: Method `Ast::Crispr::MatchProfile#normalize_payload_kind` is defined at both lib/ast/crispr.rb:306 and lib/ast/crispr.rb:1439.", 2604742721], - [1444, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::SelectionProfile`.", 2464089216], - [1466, 7, 14, "Lint/DuplicateMethods: Method `Ast::Crispr::SelectionProfile#initialize` is defined at both lib/ast/crispr.rb:531 and lib/ast/crispr.rb:1466.", 956205738], - [1466, 7, 773, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `initialize` is too high. [8/7]", 771809109], - [1466, 7, 773, "Metrics/MethodLength: Method has too many lines. [11/10]", 771809109], - [1466, 21, 190, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 4167448336], - [1481, 7, 1286, "Metrics/AbcSize: Assignment Branch Condition size for `report` is too high. [<5, 29, 13> 32.17/17]", 1720478959], - [1481, 7, 1286, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `report` is too high. [11/7]", 1720478959], - [1481, 7, 1286, "Metrics/MethodLength: Method has too many lines. [17/10]", 1720478959], - [1481, 7, 1286, "Metrics/PerceivedComplexity: Perceived complexity for `report` is too high. [11/8]", 1720478959], - [1496, 121, 37, "Layout/LineLength: Line is too long. [157/120]", 1470192175], - [1520, 5, 24, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::DestinationProfile`.", 3442102524], - [1534, 7, 29, "Lint/DuplicateMethods: Method `Ast::Crispr::DestinationProfile#normalize_resolution_kind` is defined at both lib/ast/crispr.rb:437 and lib/ast/crispr.rb:1534.", 99310177], - [1538, 7, 31, "Lint/DuplicateMethods: Method `Ast::Crispr::DestinationProfile#normalize_resolution_source` is defined at both lib/ast/crispr.rb:444 and lib/ast/crispr.rb:1538.", 1692065396], - [1542, 7, 29, "Lint/DuplicateMethods: Method `Ast::Crispr::DestinationProfile#normalize_anchor_boundary` is defined at both lib/ast/crispr.rb:452 and lib/ast/crispr.rb:1542.", 3028754726], - [1547, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::OperationProfile`.", 1974079861], - [1550, 7, 733, "Metrics/MethodLength: Method has too many lines. [13/10]", 2619513218], - [1570, 7, 25, "Lint/DuplicateMethods: Method `Ast::Crispr::OperationProfile#normalize_requirement` is defined at both lib/ast/crispr.rb:678 and lib/ast/crispr.rb:1570.", 440444039], - [1574, 7, 32, "Lint/DuplicateMethods: Method `Ast::Crispr::OperationProfile#normalize_replacement_source` is defined at both lib/ast/crispr.rb:686 and lib/ast/crispr.rb:1574.", 3533021156], - [1579, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::StructureProfile`.", 614380405], - [1595, 5, 6309, "Metrics/ClassLength: Class has too many lines. [172/100]", 1270437788], - [1600, 7, 2717, "Metrics/MethodLength: Method has too many lines. [67/10]", 1469599129], - [1665, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 259030389], - [1678, 28, 247, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 3385598543], - [1710, 28, 242, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 1038219895] + [305, 5, 24, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::DestinationProfile`.", 3442102524], + [305, 5, 3968, "Metrics/ClassLength: Class has too many lines. [112/100]", 2145439366], + [343, 21, 126, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 931636409], + [408, 7, 667, "Metrics/MethodLength: Method has too many lines. [15/10]", 4004247638], + [441, 5, 27, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::DestinationResolution`.", 1305107769], + [455, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::StructureProfile`.", 614380405], + [493, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::SelectionProfile`.", 2464089216], + [512, 7, 794, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `initialize` is too high. [8/7]", 3998501304], + [512, 7, 794, "Metrics/MethodLength: Method has too many lines. [11/10]", 3998501304], + [512, 21, 211, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 1155506365], + [552, 7, 585, "Metrics/MethodLength: Method has too many lines. [13/10]", 13786997], + [569, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::OperationProfile`.", 1974079861], + [601, 21, 188, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 2526147676], + [656, 7, 478, "Metrics/MethodLength: Method has too many lines. [11/10]", 795235914], + [682, 7, 10, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Adapters::Null`.", 3515430288], + [715, 5, 21, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::DocumentContext`.", 594998459], + [775, 5, 19, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::OwnerSelector`.", 3092459999], + [778, 21, 81, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 2293822273], + [840, 7, 606, "Metrics/MethodLength: Method has too many lines. [16/10]", 422136278], + [870, 5, 16, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::Selectors`.", 2133324825], + [870, 5, 5586, "Metrics/ModuleLength: Module has too many lines. [130/100]", 3440946513], + [873, 7, 1642, "Metrics/AbcSize: Assignment Branch Condition size for `owner_filter` is too high. [<6, 18, 11> 21.93/17]", 3224577904], + [873, 7, 1642, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `owner_filter` is too high. [10/7]", 3224577904], + [873, 7, 1642, "Metrics/MethodLength: Method has too many lines. [37/10]", 3224577904], + [873, 7, 1642, "Metrics/PerceivedComplexity: Perceived complexity for `owner_filter` is too high. [11/8]", 3224577904], + [873, 23, 135, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 3231562627], + [917, 7, 1936, "Metrics/AbcSize: Assignment Branch Condition size for `comment_region_owned_owner` is too high. [<7, 16, 7> 18.81/17]", 2629441148], + [917, 7, 1936, "Metrics/MethodLength: Method has too many lines. [40/10]", 2629441148], + [917, 37, 190, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 4159525724], + [918, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 940069302], + [962, 7, 1731, "Metrics/AbcSize: Assignment Branch Condition size for `line_block` is too high. [<12, 22, 14> 28.71/17]", 1307990669], + [962, 7, 1731, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `line_block` is too high. [12/7]", 1307990669], + [962, 7, 1731, "Metrics/MethodLength: Method has too many lines. [38/10]", 1307990669], + [962, 7, 1731, "Metrics/PerceivedComplexity: Perceived complexity for `line_block` is too high. [12/8]", 1307990669], + [962, 21, 130, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 515174999], + [1014, 5, 23, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::OperationSupport`.", 343849029], + [1014, 5, 9160, "Metrics/ModuleLength: Module has too many lines. [203/100]", 4118890580], + [1055, 7, 983, "Metrics/MethodLength: Method has too many lines. [23/10]", 152504950], + [1137, 7, 1758, "Metrics/AbcSize: Assignment Branch Condition size for `insertion_from` is too high. [<5, 21, 11> 24.23/17]", 29011294], + [1137, 7, 1758, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `insertion_from` is too high. [9/7]", 29011294], + [1137, 7, 1758, "Metrics/MethodLength: Method has too many lines. [28/10]", 29011294], + [1137, 7, 1758, "Metrics/PerceivedComplexity: Perceived complexity for `insertion_from` is too high. [10/8]", 29011294], + [1180, 7, 827, "Metrics/AbcSize: Assignment Branch Condition size for `splice_after_anchor` is too high. [<4, 19, 2> 19.52/17]", 14691010], + [1180, 7, 827, "Metrics/MethodLength: Method has too many lines. [16/10]", 14691010], + [1184, 9, 72, "Style/RaiseArgs: Provide an exception class and message as arguments to `raise`.", 789091243], + [1186, 23, 72, "Style/StringConcatenation: Prefer string interpolation to string concatenation.", 2503424841], + [1218, 9, 25, "Style/StringConcatenation: Prefer string interpolation to string concatenation.", 768340433], + [1262, 5, 26, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::OperationProfilable`.", 4114431854], + [1271, 7, 19, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::OperationProfilable::ClassMethods`.", 3606528253], + [1283, 5, 18, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::MergeReplace`.", 395761599], + [1311, 7, 789, "Metrics/AbcSize: Assignment Branch Condition size for `call` is too high. [<11, 35, 3> 36.81/17]", 793163309], + [1311, 7, 789, "Metrics/MethodLength: Method has too many lines. [20/10]", 793163309], + [1336, 5, 13, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Replace`.", 1563590855], + [1361, 7, 643, "Metrics/AbcSize: Assignment Branch Condition size for `call` is too high. [<10, 32, 3> 33.66/17]", 3656683885], + [1361, 7, 643, "Metrics/MethodLength: Method has too many lines. [14/10]", 3656683885], + [1380, 5, 12, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Delete`.", 2011475922], + [1404, 7, 538, "Metrics/AbcSize: Assignment Branch Condition size for `call` is too high. [<7, 21, 1> 22.16/17]", 2655200768], + [1404, 7, 538, "Metrics/MethodLength: Method has too many lines. [13/10]", 2655200768], + [1422, 5, 17, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::DeleteBatch`.", 727028494], + [1446, 7, 866, "Metrics/AbcSize: Assignment Branch Condition size for `call` is too high. [<14, 35, 5> 38.03/17]", 19628260], + [1446, 7, 866, "Metrics/MethodLength: Method has too many lines. [20/10]", 19628260], + [1472, 5, 12, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Insert`.", 1590185308], + [1506, 5, 10, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::Move`.", 3515667002], + [1534, 7, 1182, "Metrics/AbcSize: Assignment Branch Condition size for `call` is too high. [<14, 40, 7> 42.95/17]", 172197360], + [1534, 7, 1182, "Metrics/MethodLength: Method has too many lines. [22/10]", 172197360], + [1551, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 2688172402], + [1564, 3, 13, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr`.", 315644438], + [1564, 3, 10812, "Metrics/ModuleLength: Module has too many lines. [180/100]", 1841926844], + [1565, 5, 33, "Style/Documentation: Missing top-level documentation comment for `module Ast::Crispr::ProfileReportCompatibility`.", 3039519892], + [1587, 5, 18, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::MatchProfile`.", 365273299], + [1600, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::SelectionProfile`.", 2464089216], + [1622, 7, 1286, "Metrics/AbcSize: Assignment Branch Condition size for `report` is too high. [<5, 29, 13> 32.17/17]", 1720478959], + [1622, 7, 1286, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `report` is too high. [11/7]", 1720478959], + [1622, 7, 1286, "Metrics/MethodLength: Method has too many lines. [17/10]", 1720478959], + [1622, 7, 1286, "Metrics/PerceivedComplexity: Perceived complexity for `report` is too high. [11/8]", 1720478959], + [1637, 121, 37, "Layout/LineLength: Line is too long. [157/120]", 1470192175], + [1643, 5, 24, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::DestinationProfile`.", 3442102524], + [1658, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::OperationProfile`.", 1974079861], + [1661, 7, 733, "Metrics/MethodLength: Method has too many lines. [13/10]", 2619513218], + [1678, 5, 22, "Style/Documentation: Missing top-level documentation comment for `class Ast::Crispr::StructureProfile`.", 614380405], + [1686, 5, 6309, "Metrics/ClassLength: Class has too many lines. [172/100]", 1270437788], + [1691, 7, 2717, "Metrics/MethodLength: Method has too many lines. [67/10]", 1469599129], + [1756, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 259030389], + [1769, 28, 247, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 3385598543], + [1801, 28, 242, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 1038219895] ], "lib/ast/crispr/rspec/shared_examples/destination_profile.rb:2529475135": [ [3, 1, 2386, "Metrics/BlockLength: Block has too many lines. [28/25]", 2846758965], @@ -197,17 +208,22 @@ "lib/ast/crispr/rspec/shared_examples/operation_profile.rb:3583567850": [ [3, 1, 2148, "Metrics/BlockLength: Block has too many lines. [26/25]", 2745151209] ], - "spec/old_runtime_spec.rb:1564590841": [ - [3, 1, 17728, "Metrics/BlockLength: Block has too many lines. [383/25]", 205400157], - [4, 3, 69, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 3712453399], - [5, 3, 68, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 1429320782], - [6, 3, 59, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 253007150], - [8, 3, 891, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 361389624], - [18, 37, 11, "Lint/UnusedMethodArgument: Unused method argument - `owner_scope`.", 3846606321], - [22, 46, 6, "Lint/UnusedMethodArgument: Unused method argument - `region`.", 2124512157], - [22, 64, 11, "Lint/UnusedMethodArgument: Unused method argument - `owner_scope`.", 3846606321], - [73, 3, 8534, "Metrics/BlockLength: Block has too many lines. [176/25]", 3042299525], - [313, 3, 3640, "Metrics/BlockLength: Block has too many lines. [72/25]", 1133370152], - [418, 3, 1663, "Metrics/BlockLength: Block has too many lines. [41/25]", 115074475] + "spec/old_runtime_spec.rb:682575016": [ + [5, 1, 22396, "Metrics/BlockLength: Block has too many lines. [485/25]", 3050657641], + [6, 3, 69, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 3712453399], + [7, 3, 68, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 1429320782], + [8, 3, 59, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 253007150], + [10, 3, 965, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 315542089], + [24, 37, 11, "Lint/UnusedMethodArgument: Unused method argument - `owner_scope`.", 3846606321], + [28, 46, 6, "Lint/UnusedMethodArgument: Unused method argument - `region`.", 2124512157], + [28, 64, 11, "Lint/UnusedMethodArgument: Unused method argument - `owner_scope`.", 3846606321], + [87, 3, 8534, "Metrics/BlockLength: Block has too many lines. [176/25]", 3042299525], + [327, 3, 5459, "Metrics/BlockLength: Block has too many lines. [108/25]", 2383759627], + [507, 3, 1417, "Metrics/BlockLength: Block has too many lines. [28/25]", 1907697465], + [508, 5, 1365, "Metrics/BlockLength: Block has too many lines. [26/25]", 3735259564], + [540, 3, 1663, "Metrics/BlockLength: Block has too many lines. [41/25]", 115074475] + ], + "spec/provider_architecture_spec.rb:3233381474": [ + [3, 1, 1743, "Metrics/BlockLength: Block has too many lines. [28/25]", 896214455] ] } diff --git a/gems/ast-crispr/.simplecov b/gems/ast-crispr/.simplecov index dd7e12623..e7a9c8ac8 100644 --- a/gems/ast-crispr/.simplecov +++ b/gems/ast-crispr/.simplecov @@ -4,15 +4,11 @@ # ast-crispr will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/ast-crispr/.structuredmerge/kettle-jem.yml b/gems/ast-crispr/.structuredmerge/kettle-jem.yml index e8a8182a8..a9ac7a16e 100644 --- a/gems/ast-crispr/.structuredmerge/kettle-jem.yml +++ b/gems/ast-crispr/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/ast/crispr/version.rb - source: sig/gem.rbs diff --git a/gems/ast-crispr/Gemfile b/gems/ast-crispr/Gemfile index 408241295..fc1c4d762 100644 --- a/gems/ast-crispr/Gemfile +++ b/gems/ast-crispr/Gemfile @@ -37,298 +37,6 @@ if direct_sibling_gems.any? && direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local @@ -351,62 +59,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -414,7 +68,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/ast-crispr/Gemfile.lock b/gems/ast-crispr/Gemfile.lock index 0b6a216c5..d34e5295a 100644 --- a/gems/ast-crispr/Gemfile.lock +++ b/gems/ast-crispr/Gemfile.lock @@ -6,272 +6,6 @@ PATH service_actor (~> 3.9) version_gem (~> 1.1, >= 1.1.9) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,22 +16,26 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +43,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +73,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +92,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +116,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,21 +125,10 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) mutex_m (0.3.0) - nokogiri (1.19.4-aarch64-linux-gnu) - racc (~> 1.4) - nokogiri (1.19.4-aarch64-linux-musl) - racc (~> 1.4) - nokogiri (1.19.4-arm64-darwin) - racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.19.4-x86_64-linux-musl) - racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +149,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +204,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +219,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +258,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -535,23 +284,19 @@ GEM silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +309,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +332,16 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +351,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -624,120 +378,77 @@ GEM zlib (3.2.3) PLATFORMS - aarch64-linux - aarch64-linux-gnu - aarch64-linux-musl - arm64-darwin - x86_64-darwin + x86_64-linux x86_64-linux-gnu - x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.0, >= 3.0.6) + appraisal2-rubocop (~> 1.0, >= 1.0.0) ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! - ast-template! - bash-merge! benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! - commonmarker-merge! + cgi (~> 0.5) debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.0) - go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.0, >= 2.2.25) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) + kettle-soup-cover (~> 3.0, >= 3.0.3) kettle-test (~> 2.0, >= 2.0.9) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) + standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.3) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + tree_sitter_language_pack (~> 1.13, >= 1.13.3) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.16) sha256=d6ca5dd440c24f9abce9844cf44cc8e18c6a553de65a47efb4544137af92c47d bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -746,61 +457,42 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 - json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 - markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 - nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f - nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af - nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a - nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -818,35 +510,38 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -855,20 +550,16 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -876,7 +567,6 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH diff --git a/gems/ast-crispr/README.md b/gems/ast-crispr/README.md index ba2da8bec..8ed7f1c77 100644 --- a/gems/ast-crispr/README.md +++ b/gems/ast-crispr/README.md @@ -36,7 +36,7 @@ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-ta | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | @@ -196,6 +196,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-crispr [⛳️namespace-img]: https://img.shields.io/badge/namespace-Ast::Crispr-3C2D2D.svg?style=square&logo=ruby&logoColor=white diff --git a/gems/ast-crispr/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/ast-crispr/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/ast-crispr/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/ast-crispr/gemfiles/modular/cgi/vHEAD.gemfile b/gems/ast-crispr/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/ast-crispr/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/ast-crispr/gemfiles/modular/coverage.gemfile b/gems/ast-crispr/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/ast-crispr/gemfiles/modular/coverage.gemfile +++ b/gems/ast-crispr/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/ast-crispr/gemfiles/modular/coverage_local.gemfile b/gems/ast-crispr/gemfiles/modular/coverage_local.gemfile index 8fef2c50e..9b7dad77d 100644 --- a/gems/ast-crispr/gemfiles/modular/coverage_local.gemfile +++ b/gems/ast-crispr/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require "nomono/bundler" local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[ast-crispr] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-crispr/gemfiles/modular/documentation.gemfile b/gems/ast-crispr/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/ast-crispr/gemfiles/modular/documentation.gemfile +++ b/gems/ast-crispr/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/ast-crispr/gemfiles/modular/documentation_local.gemfile b/gems/ast-crispr/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..610362699 100644 --- a/gems/ast-crispr/gemfiles/modular/documentation_local.gemfile +++ b/gems/ast-crispr/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require "nomono/bundler" local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-crispr] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/ast-crispr/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/ast-crispr/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-crispr/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/ast-crispr/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-crispr/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/ast-crispr/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-crispr/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/ast-crispr/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-crispr/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/ast-crispr/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/ast-crispr/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/ast-crispr/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/ast-crispr/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/ast-crispr/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/ast-crispr/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/ast-crispr/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/ast-crispr/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/ast-crispr/gemfiles/modular/optional.gemfile b/gems/ast-crispr/gemfiles/modular/optional.gemfile index c6b1a82a7..9ea429538 100644 --- a/gems/ast-crispr/gemfiles/modular/optional.gemfile +++ b/gems/ast-crispr/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-crispr templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/ast-crispr/gemfiles/modular/runtime_heads.gemfile b/gems/ast-crispr/gemfiles/modular/runtime_heads.gemfile index a60320ea2..ebf17c529 100644 --- a/gems/ast-crispr/gemfiles/modular/runtime_heads.gemfile +++ b/gems/ast-crispr/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-crispr templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/ast-crispr/gemfiles/modular/style.gemfile b/gems/ast-crispr/gemfiles/modular/style.gemfile index c85c9954b..4dbcc02c0 100644 --- a/gems/ast-crispr/gemfiles/modular/style.gemfile +++ b/gems/ast-crispr/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during ast-crispr templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/ast-crispr/gemfiles/modular/style_local.gemfile b/gems/ast-crispr/gemfiles/modular/style_local.gemfile index ce75bbe21..1d53a3076 100644 --- a/gems/ast-crispr/gemfiles/modular/style_local.gemfile +++ b/gems/ast-crispr/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require "nomono/bundler" local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-crispr] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/ast-crispr/gemfiles/modular/templating.gemfile b/gems/ast-crispr/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/ast-crispr/gemfiles/modular/templating.gemfile +++ b/gems/ast-crispr/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/ast-crispr/gemfiles/modular/templating_local.gemfile b/gems/ast-crispr/gemfiles/modular/templating_local.gemfile index 33f003f01..ecbe542ab 100644 --- a/gems/ast-crispr/gemfiles/modular/templating_local.gemfile +++ b/gems/ast-crispr/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require "nomono/bundler" structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-crispr] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-crispr] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[ast-crispr] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-crispr/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/ast-crispr/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/ast-crispr/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/ast-crispr/gemfiles/modular/webrick/vHEAD.gemfile b/gems/ast-crispr/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/ast-crispr/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/ast-crispr/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/ast-crispr/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/ast-crispr/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/ast-crispr/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/ast-crispr/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/ast-crispr/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/ast-crispr/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/ast-crispr/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/ast-crispr/lib/ast/crispr.rb b/gems/ast-crispr/lib/ast/crispr.rb index 04d239161..c1488c75f 100644 --- a/gems/ast-crispr/lib/ast/crispr.rb +++ b/gems/ast-crispr/lib/ast/crispr.rb @@ -580,6 +580,10 @@ class OperationProfile family: :removal, description: 'Delete selected content without inserting replacement text' }, + delete_batch: { + family: :removal, + description: 'Delete content selected by multiple structural selectors in one source pass' + }, insert: { family: :insertion, description: 'Insert explicit text at a destination anchor or append fallback' @@ -665,7 +669,7 @@ def to_h private - def normalize_requirement(value, field_name) + def normalize_requirement(value, _field_name) value&.to_sym end @@ -1021,6 +1025,11 @@ def context_for(content:, source_label:, target: nil) DocumentContext.new(content: content, source_label: source_label, adapter: adapter || Adapters::Null.new) end + def context_for_targets(content:, source_label:, targets:) + first_target = Array(targets).first + context_for(content: content, source_label: source_label, target: first_target) + end + def enforce_limit!(target, count) return if target.limit.allows?(count) @@ -1410,6 +1419,56 @@ def call end end + class DeleteBatch < Actor + include OperationSupport + include OperationProfilable + + declare_operation_profile( + operation_kind: :delete_batch, + source_requirement: :required, + destination_requirement: :none, + replacement_source: :none, + captures_source_text: true, + supports_if_missing: false + ) + + input :content, type: String + input :targets, default: -> { [] } + input :source_label, type: String, default: 'source' + + output :updated_content + output :matches, default: -> { [] } + output :match_count, type: Integer, default: 0 + output :changed, default: false + output :captured_text, allow_nil: true, default: nil + output :operation_profile + + def call + self.operation_profile = self.class.operation_profile + selector_targets = Array(targets) + if selector_targets.empty? + self.updated_content = content + self.changed = false + return + end + + context = context_for_targets(content: content, source_label: source_label, targets: selector_targets) + self.matches = selector_targets.flat_map { |target| normalize_matches(target, context) } + self.match_count = matches.size + self.captured_text = capture_text(content, matches) + if matches.empty? + self.updated_content = content + self.changed = false + return + end + + self.updated_content = replace_line_ranges(content, matches, '') + self.changed = updated_content != content + rescue Error => e + crispr_fail!(e) + end + end + class Insert < Actor include OperationSupport include OperationProfilable diff --git a/gems/ast-crispr/spec/old_runtime_spec.rb b/gems/ast-crispr/spec/old_runtime_spec.rb index 7e8509493..d03f762b9 100644 --- a/gems/ast-crispr/spec/old_runtime_spec.rb +++ b/gems/ast-crispr/spec/old_runtime_spec.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require 'json' -require 'pathname' RSpec.describe Ast::Crispr do FakeLocation = Struct.new(:start_line, :end_line, keyword_init: true) @@ -9,12 +8,16 @@ FakeOwner = Struct.new(:location, :key, keyword_init: true) class FakeAdapter + attr_reader :read_count + def initialize(owners:, comments:) @owners = owners @comments = comments + @read_count = 0 end def read_ast(_document) + @read_count += 1 { owners: @owners, comments: @comments } end @@ -382,6 +385,26 @@ def read_json(path) it_behaves_like 'Ast::Crispr::OperationProfile contract' end + describe Ast::Crispr::DeleteBatch do + let(:operation_profile) { described_class.operation_profile } + let(:expected_operation_kind) { :delete_batch } + let(:expected_operation_family) { :removal } + let(:expected_known_operation_kind) { true } + let(:expected_source_requirement) { :required } + let(:expected_destination_requirement) { :none } + let(:expected_replacement_source) { :none } + let(:expected_captures_source_text) { true } + let(:expected_supports_if_missing) { false } + let(:expected_selects_source) { true } + let(:expected_requires_source) { true } + let(:expected_supports_destination) { false } + let(:expected_requires_destination) { false } + let(:expected_explicit_replacement) { false } + let(:expected_may_reuse_captured_text) { false } + + it_behaves_like 'Ast::Crispr::OperationProfile contract' + end + describe Ast::Crispr::Insert do let(:operation_profile) { described_class.operation_profile } let(:expected_operation_kind) { :insert } @@ -446,6 +469,41 @@ def read_json(path) end end + describe described_class::DeleteBatch do + it 'deletes matches from multiple selectors using one document context' do + content = <<~TEXT + ### MANAGED SNIPPET + puts "one" + + ### MANAGED SNIPPET + puts "two" + puts "still managed" + + ### STABLE + puts "stable" + TEXT + selector_one = Ast::Crispr::Selectors.owner_filter( + id: 'managed-one', + adapter: adapter, + limit: { exactly: 1 } + ) { |_context, owner| owner.key == :managed_one } + selector_two = Ast::Crispr::Selectors.owner_filter( + id: 'stable', + adapter: adapter, + limit: { exactly: 1 } + ) { |_context, owner| owner.key == :stable } + + actor = described_class.call(content: content, targets: [selector_one, selector_two]) + + expect(actor.changed).to be(true) + expect(actor.match_count).to eq(2) + expect(actor.captured_text).to include('puts "one"') + expect(actor.captured_text).to include('puts "stable"') + expect(actor.updated_content).to eq("\n### MANAGED SNIPPET\nputs \"two\"\nputs \"still managed\"\n\n") + expect(adapter.read_count).to eq(1) + end + end + describe described_class::MergeReplace do it 'merges replacement text into the selected slice before splicing it back' do fixture = read_json(fixtures_root.join('diagnostics', 'slice-1018-crispr-slice-merge', diff --git a/gems/ast-crispr/spec/provider_architecture_spec.rb b/gems/ast-crispr/spec/provider_architecture_spec.rb index d816944b9..123f09b8c 100644 --- a/gems/ast-crispr/spec/provider_architecture_spec.rb +++ b/gems/ast-crispr/spec/provider_architecture_spec.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require 'pathname' - RSpec.describe 'Ast::Crispr provider architecture' do let(:repo_root) { Pathname(__dir__).join('..', '..', '..').expand_path } let(:provider_lib_files) { repo_root.join('gems').glob('ast-crispr-*/lib/**/*.rb') } diff --git a/gems/ast-crispr/spec/spec_helper.rb b/gems/ast-crispr/spec/spec_helper.rb index f97c61e87..9bd936172 100644 --- a/gems/ast-crispr/spec/spec_helper.rb +++ b/gems/ast-crispr/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/ast-merge-git/.kettle-drift.lock b/gems/ast-merge-git/.kettle-drift.lock deleted file mode 100644 index e3a4ed60c..000000000 --- a/gems/ast-merge-git/.kettle-drift.lock +++ /dev/null @@ -1,337 +0,0 @@ -{ - "(direct_sibling_local ||\nENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)": [ - { - "file": "Gemfile", - "lines": [ - 80, - 120, - 160, - 200, - 240, - 280, - 320, - 360, - 400 - ] - } - ], - ".find { |spec| spec.name == 'nomono' }\nnomono_locked = nomono_locked_spec &&": [ - { - "file": "Gemfile", - "lines": [ - 91, - 131, - 171, - 211, - 251, - 291, - 331, - 371, - 411 - ] - } - ], - "ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)\ndirect_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')": [ - { - "file": "Gemfile", - "lines": [ - 81, - 121, - 161, - 201, - 241, - 281, - 321, - 361, - 401 - ] - } - ], - "Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)\nnomono_activation_requirements = [\"= #{nomono_locked_spec.version}\"] if nomono_locked": [ - { - "file": "Gemfile", - "lines": [ - 93, - 133, - 173, - 213, - 253, - 293, - 333, - 373, - 413 - ] - } - ], - "Kernel.send(:gem, 'nomono', *nomono_activation_requirements)\nrequire 'nomono/bundler'": [ - { - "file": "Gemfile", - "lines": [ - 96, - 136, - 176, - 216, - 256, - 296, - 336, - 376, - 416 - ] - } - ], - "direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')\ndirect_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)": [ - { - "file": "Gemfile", - "lines": [ - 82, - 122, - 162, - 202, - 242, - 282, - 322, - 362, - 402 - ] - } - ], - "eval_nomono_gems(\ngems: direct_sibling_gems,": [ - { - "file": "Gemfile", - "lines": [ - 60, - 100, - 140, - 180, - 220, - 260, - 300, - 340, - 380, - 420 - ] - } - ], - "gems: direct_sibling_gems,\nprefix: 'STRUCTUREDMERGE',": [ - { - "file": "Gemfile", - "lines": [ - 101, - 141, - 181, - 221, - 261, - 301, - 341, - 381, - 421 - ] - } - ], - "if File.file?(nomono_lockfile)\nnomono_locked_spec = Bundler::LockfileParser": [ - { - "file": "Gemfile", - "lines": [ - 43, - 87, - 127, - 167, - 207, - 247, - 287, - 327, - 367, - 407 - ] - } - ], - "if direct_sibling_dev_was_set\nENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original": [ - { - "file": "Gemfile", - "lines": [ - 110, - 150, - 190, - 230, - 270, - 310, - 350, - 390, - 430 - ] - } - ], - "if direct_sibling_gems.any? &&\n(direct_sibling_local ||": [ - { - "file": "Gemfile", - "lines": [ - 35, - 79, - 119, - 159, - 199, - 239, - 279, - 319, - 359, - 399 - ] - } - ], - "if direct_sibling_templating && !direct_sibling_local\nif direct_sibling_dev_was_set": [ - { - "file": "Gemfile", - "lines": [ - 69, - 109, - 149, - 189, - 229, - 269, - 309, - 349, - 389, - 429 - ] - } - ], - "nomono_activation_requirements = nomono_requirements\nnomono_lockfile = File.expand_path('Gemfile.lock', __dir__)": [ - { - "file": "Gemfile", - "lines": [ - 85, - 125, - 165, - 205, - 245, - 285, - 325, - 365, - 405 - ] - } - ], - "nomono_locked = nomono_locked_spec &&\nGem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)": [ - { - "file": "Gemfile", - "lines": [ - 48, - 92, - 132, - 172, - 212, - 252, - 292, - 332, - 372, - 412 - ] - } - ], - "nomono_locked_spec = Bundler::LockfileParser\n.new(Bundler.read_file(nomono_lockfile))": [ - { - "file": "Gemfile", - "lines": [ - 44, - 88, - 128, - 168, - 208, - 248, - 288, - 328, - 368, - 408 - ] - } - ], - "nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)\nif File.file?(nomono_lockfile)": [ - { - "file": "Gemfile", - "lines": [ - 86, - 126, - 166, - 206, - 246, - 286, - 326, - 366, - 406 - ] - } - ], - "path_env: 'STRUCTUREDMERGE_DEV',\nroot: %w[src my structuredmerge]": [ - { - "file": "Gemfile", - "lines": [ - 103, - 143, - 183, - 223, - 263, - 303, - 343, - 383, - 423 - ] - } - ], - "prefix: 'STRUCTUREDMERGE',\npath_env: 'STRUCTUREDMERGE_DEV',": [ - { - "file": "Gemfile", - "lines": [ - 102, - 142, - 182, - 222, - 262, - 302, - 342, - 382, - 422 - ] - } - ], - "require 'nomono/bundler'\nENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local": [ - { - "file": "Gemfile", - "lines": [ - 97, - 137, - 177, - 217, - 257, - 297, - 337, - 377, - 417 - ] - } - ], - "rescue LoadError\nwarn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'": [ - { - "file": "Gemfile", - "lines": [ - 106, - 146, - 186, - 226, - 266, - 306, - 346, - 386, - 426 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 - ] - } - ] -} diff --git a/gems/ast-merge-git/.rubocop_gradual.lock b/gems/ast-merge-git/.rubocop_gradual.lock index ff0066794..4088e89b4 100644 --- a/gems/ast-merge-git/.rubocop_gradual.lock +++ b/gems/ast-merge-git/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:1859435982": [ + ".simplecov:2758685973": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:1078627597": [ @@ -21,13 +21,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -63,6 +70,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -72,10 +86,10 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], diff --git a/gems/ast-merge-git/.simplecov b/gems/ast-merge-git/.simplecov index 80bb5187d..afdbb1755 100644 --- a/gems/ast-merge-git/.simplecov +++ b/gems/ast-merge-git/.simplecov @@ -4,15 +4,11 @@ # ast-merge-git will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/ast-merge-git/.structuredmerge/kettle-jem.yml b/gems/ast-merge-git/.structuredmerge/kettle-jem.yml index 276c6e7bb..53f002c15 100644 --- a/gems/ast-merge-git/.structuredmerge/kettle-jem.yml +++ b/gems/ast-merge-git/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/ast/merge/git/version.rb - source: sig/gem.rbs diff --git a/gems/ast-merge-git/Gemfile b/gems/ast-merge-git/Gemfile index d8a97d415..ee961dec3 100644 --- a/gems/ast-merge-git/Gemfile +++ b/gems/ast-merge-git/Gemfile @@ -37,260 +37,8 @@ if direct_sibling_gems.any? && ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) + require 'nomono/bundler' begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( @@ -299,8 +47,6 @@ if direct_sibling_gems.any? && path_env: 'STRUCTUREDMERGE_DEV', root: %w[src my structuredmerge] ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -312,142 +58,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -455,7 +67,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/ast-merge-git/Gemfile.lock b/gems/ast-merge-git/Gemfile.lock index 6c4aeff4b..5c10515c9 100644 --- a/gems/ast-merge-git/Gemfile.lock +++ b/gems/ast-merge-git/Gemfile.lock @@ -6,272 +6,6 @@ PATH json-merge (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,22 +16,26 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +43,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +73,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +92,24 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + json-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +120,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,21 +129,10 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) mutex_m (0.3.0) - nokogiri (1.19.4-aarch64-linux-gnu) - racc (~> 1.4) - nokogiri (1.19.4-aarch64-linux-musl) - racc (~> 1.4) - nokogiri (1.19.4-arm64-darwin) - racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.19.4-x86_64-linux-musl) - racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +153,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +208,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +223,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +262,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -530,28 +283,22 @@ GEM ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) - service_actor (3.9.4) - zeitwerk (>= 1.0) silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +311,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +334,16 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +353,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -624,120 +380,77 @@ GEM zlib (3.2.3) PLATFORMS - aarch64-linux - aarch64-linux-gnu - aarch64-linux-musl - arm64-darwin - x86_64-darwin + x86_64-linux x86_64-linux-gnu - x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.0, >= 3.0.6) - ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! + appraisal2-rubocop (~> 1.0, >= 1.0.0) ast-merge-git! - ast-template! - bash-merge! benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! - commonmarker-merge! + cgi (~> 0.5) debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.0) - go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.0, >= 2.2.25) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) + kettle-soup-cover (~> 3.0, >= 3.0.3) kettle-test (~> 2.0, >= 2.0.9) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) + standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.3) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + tree_sitter_language_pack (~> 1.13, >= 1.13.3) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 - ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -746,61 +459,43 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 - markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 - nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f - nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af - nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a - nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -818,35 +513,37 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) - service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -855,20 +552,16 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -876,8 +569,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/ast-merge-git/LICENSE.md b/gems/ast-merge-git/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/ast-merge-git/LICENSE.md +++ b/gems/ast-merge-git/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/ast-merge-git/README.md b/gems/ast-merge-git/README.md index 6206226da..43d47a409 100644 --- a/gems/ast-merge-git/README.md +++ b/gems/ast-merge-git/README.md @@ -35,8 +35,8 @@ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-ta | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -154,7 +154,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -180,6 +180,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-merge-git [⛳️namespace-img]: https://img.shields.io/badge/namespace-Ast::Merge::Git-3C2D2D.svg?style=square&logo=ruby&logoColor=white @@ -224,7 +226,7 @@ If none of the available licenses suit your use case, please [contact us](mailto [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/ast-merge-git [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/ast-merge-git -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-merge-git [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/ast-merge-git/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/ast-merge-git/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/ast-merge-git/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/ast-merge-git/gemfiles/modular/cgi/vHEAD.gemfile b/gems/ast-merge-git/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/ast-merge-git/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/ast-merge-git/gemfiles/modular/coverage.gemfile b/gems/ast-merge-git/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/ast-merge-git/gemfiles/modular/coverage.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/ast-merge-git/gemfiles/modular/coverage_local.gemfile b/gems/ast-merge-git/gemfiles/modular/coverage_local.gemfile index f2d1ad9c2..1fb5c6d9b 100644 --- a/gems/ast-merge-git/gemfiles/modular/coverage_local.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[ast-merge-git] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-merge-git/gemfiles/modular/documentation.gemfile b/gems/ast-merge-git/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/ast-merge-git/gemfiles/modular/documentation.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/ast-merge-git/gemfiles/modular/documentation_local.gemfile b/gems/ast-merge-git/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..32de7815d 100644 --- a/gems/ast-merge-git/gemfiles/modular/documentation_local.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-merge-git] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/ast-merge-git/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/ast-merge-git/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-merge-git/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-merge-git/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/ast-merge-git/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-merge-git/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-merge-git/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/ast-merge-git/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/ast-merge-git/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/ast-merge-git/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/ast-merge-git/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/ast-merge-git/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/ast-merge-git/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/ast-merge-git/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/ast-merge-git/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/ast-merge-git/gemfiles/modular/optional.gemfile b/gems/ast-merge-git/gemfiles/modular/optional.gemfile index d254d7d3c..9ea429538 100644 --- a/gems/ast-merge-git/gemfiles/modular/optional.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-merge-git templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/ast-merge-git/gemfiles/modular/runtime_heads.gemfile b/gems/ast-merge-git/gemfiles/modular/runtime_heads.gemfile index f5084bf14..ebf17c529 100644 --- a/gems/ast-merge-git/gemfiles/modular/runtime_heads.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-merge-git templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/ast-merge-git/gemfiles/modular/style.gemfile b/gems/ast-merge-git/gemfiles/modular/style.gemfile index a740fe017..4dbcc02c0 100644 --- a/gems/ast-merge-git/gemfiles/modular/style.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during ast-merge-git templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/ast-merge-git/gemfiles/modular/style_local.gemfile b/gems/ast-merge-git/gemfiles/modular/style_local.gemfile index ce75bbe21..6be28c0e3 100644 --- a/gems/ast-merge-git/gemfiles/modular/style_local.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-merge-git] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/ast-merge-git/gemfiles/modular/templating.gemfile b/gems/ast-merge-git/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/ast-merge-git/gemfiles/modular/templating.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/ast-merge-git/gemfiles/modular/templating_local.gemfile b/gems/ast-merge-git/gemfiles/modular/templating_local.gemfile index 62371754c..3392b5d85 100644 --- a/gems/ast-merge-git/gemfiles/modular/templating_local.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-merge-git] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-merge-git] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[ast-merge-git] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-merge-git/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/ast-merge-git/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/ast-merge-git/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/ast-merge-git/gemfiles/modular/webrick/vHEAD.gemfile b/gems/ast-merge-git/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/ast-merge-git/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/ast-merge-git/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/ast-merge-git/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/ast-merge-git/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/ast-merge-git/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/ast-merge-git/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/ast-merge-git/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/ast-merge-git/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/ast-merge-git/spec/spec_helper.rb b/gems/ast-merge-git/spec/spec_helper.rb index 62706556e..a6f48671d 100644 --- a/gems/ast-merge-git/spec/spec_helper.rb +++ b/gems/ast-merge-git/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/ast-merge/.kettle-drift.lock b/gems/ast-merge/.kettle-drift.lock index 06ea1c460..e8ac7ef1f 100644 --- a/gems/ast-merge/.kettle-drift.lock +++ b/gems/ast-merge/.kettle-drift.lock @@ -5,12 +5,7 @@ "lines": [ 79, 119, - 159, - 199, - 239, - 279, - 319, - 359 + 159 ] } ], @@ -20,12 +15,7 @@ "lines": [ 90, 130, - 170, - 210, - 250, - 290, - 330, - 370 + 170 ] } ], @@ -35,12 +25,7 @@ "lines": [ 80, 120, - 160, - 200, - 240, - 280, - 320, - 360 + 160 ] } ], @@ -50,12 +35,7 @@ "lines": [ 92, 132, - 172, - 212, - 252, - 292, - 332, - 372 + 172 ] } ], @@ -65,12 +45,7 @@ "lines": [ 95, 135, - 175, - 215, - 255, - 295, - 335, - 375 + 175 ] } ], @@ -80,12 +55,7 @@ "lines": [ 81, 121, - 161, - 201, - 241, - 281, - 321, - 361 + 161 ] } ], @@ -96,12 +66,7 @@ 59, 99, 139, - 179, - 219, - 259, - 299, - 339, - 379 + 179 ] } ], @@ -111,12 +76,7 @@ "lines": [ 100, 140, - 180, - 220, - 260, - 300, - 340, - 380 + 180 ] } ], @@ -127,12 +87,7 @@ 42, 86, 126, - 166, - 206, - 246, - 286, - 326, - 366 + 166 ] } ], @@ -142,12 +97,7 @@ "lines": [ 109, 149, - 189, - 229, - 269, - 309, - 349, - 389 + 189 ] } ], @@ -158,12 +108,7 @@ 34, 78, 118, - 158, - 198, - 238, - 278, - 318, - 358 + 158 ] } ], @@ -174,12 +119,7 @@ 68, 108, 148, - 188, - 228, - 268, - 308, - 348, - 388 + 188 ] } ], @@ -189,12 +129,7 @@ "lines": [ 84, 124, - 164, - 204, - 244, - 284, - 324, - 364 + 164 ] } ], @@ -205,12 +140,7 @@ 47, 91, 131, - 171, - 211, - 251, - 291, - 331, - 371 + 171 ] } ], @@ -221,12 +151,7 @@ 43, 87, 127, - 167, - 207, - 247, - 287, - 327, - 367 + 167 ] } ], @@ -236,12 +161,7 @@ "lines": [ 85, 125, - 165, - 205, - 245, - 285, - 325, - 365 + 165 ] } ], @@ -251,12 +171,7 @@ "lines": [ 102, 142, - 182, - 222, - 262, - 302, - 342, - 382 + 182 ] } ], @@ -266,12 +181,7 @@ "lines": [ 101, 141, - 181, - 221, - 261, - 301, - 341, - 381 + 181 ] } ], @@ -281,12 +191,7 @@ "lines": [ 96, 136, - 176, - 216, - 256, - 296, - 336, - 376 + 176 ] } ], @@ -296,12 +201,7 @@ "lines": [ 105, 145, - 185, - 225, - 265, - 305, - 345, - 385 + 185 ] } ], @@ -309,17 +209,8 @@ { "file": "spec/spec_helper.rb", "lines": [ - 35, - 42 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 + 40, + 47 ] } ] diff --git a/gems/ast-merge/.rubocop_gradual.lock b/gems/ast-merge/.rubocop_gradual.lock index bc6712ed3..80f95ef30 100644 --- a/gems/ast-merge/.rubocop_gradual.lock +++ b/gems/ast-merge/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:3463276878": [ + ".simplecov:3026903189": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:429706125": [ @@ -15,20 +15,27 @@ [145, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 981994949], [152, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 4229808912] ], - "gemfiles/modular/benchmark/r4/v0.5.gemfile:3644720371": [ - [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] + "gemfiles/modular/benchmark/r4/v0.5.gemfile:5381": [ + [1, 1, 0, "Lint/EmptyFile: Empty file detected.", 5381] + ], + "gemfiles/modular/benchmark/vHEAD.gemfile:5381": [ + [1, 1, 0, "Lint/EmptyFile: Empty file detected.", 5381], + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381] ], - "gemfiles/modular/benchmark/vHEAD.gemfile:2838879269": [ + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], - [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -64,6 +71,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -73,493 +87,493 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], "lib/ast-merge.rb:3005639624": [ [1, 1, 0, "Naming/FileName: The name of this source file (`ast-merge.rb`) should use snake_case.", 5381] ], - "lib/ast/merge.rb:3429747270": [ + "lib/ast/merge.rb:3962755273": [ [11, 3, 12, "Style/Documentation: Missing top-level documentation comment for `module Ast::Merge`.", 2866359175], - [11, 3, 270037, "Metrics/ModuleLength: Module has too many lines. [5702/100]", 2847709439], + [11, 3, 270298, "Metrics/ModuleLength: Module has too many lines. [5705/100]", 2774418219], [22, 5, 16, "Style/Documentation: Missing top-level documentation comment for `class Ast::Merge::ParseError`.", 362242086], [33, 7, 362, "Metrics/AbcSize: Assignment Branch Condition size for `build_message` is too high. [<2, 16, 6> 17.2/17]", 3988736327], [47, 5, 31, "Style/Documentation: Missing top-level documentation comment for `class Ast::Merge::PlaceholderCollisionError`.", 218924302], - [161, 7, 337, "Metrics/MethodLength: Method has too many lines. [11/10]", 2388996629], - [178, 7, 327, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `to_h` is too high. [8/7]", 979795121], - [309, 7, 383, "Metrics/MethodLength: Method has too many lines. [11/10]", 634650261], - [473, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 3450568485], - [474, 7, 461, "Metrics/MethodLength: Method has too many lines. [12/10]", 43929779], - [491, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1299979089], - [492, 7, 377, "Metrics/MethodLength: Method has too many lines. [11/10]", 3704151253], - [508, 121, 39, "Layout/LineLength: Line is too long. [159/120]", 85503958], - [509, 7, 447, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `to_h` is too high. [8/7]", 298553749], - [509, 7, 447, "Metrics/MethodLength: Method has too many lines. [12/10]", 298553749], - [538, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 1441148616], - [539, 7, 453, "Metrics/MethodLength: Method has too many lines. [14/10]", 1899007021], - [558, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193342990], - [559, 7, 400, "Metrics/MethodLength: Method has too many lines. [11/10]", 298553749], - [588, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860750], - [589, 7, 411, "Metrics/MethodLength: Method has too many lines. [12/10]", 2893925621], - [606, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3137791633], - [607, 7, 454, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `to_h` is too high. [8/7]", 298553749], - [607, 7, 454, "Metrics/MethodLength: Method has too many lines. [12/10]", 298553749], - [666, 7, 385, "Metrics/MethodLength: Method has too many lines. [11/10]", 794265461], - [703, 7, 419, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `to_h` is too high. [10/7]", 3313546353], - [703, 7, 419, "Metrics/PerceivedComplexity: Perceived complexity for `to_h` is too high. [10/8]", 3313546353], - [753, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 398187770], - [765, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 2746783933], - [812, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860841], - [820, 121, 156, "Layout/LineLength: Line is too long. [276/120]", 1149525480], - [825, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 2538424426], - [837, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 2285382915], - [847, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3962419360], - [860, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 398187770], - [862, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 3195178507], - [866, 121, 85, "Layout/LineLength: Line is too long. [205/120]", 4238980637], - [868, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 2678411233], - [870, 121, 39, "Layout/LineLength: Line is too long. [159/120]", 4028520110], - [881, 121, 110, "Layout/LineLength: Line is too long. [230/120]", 3837814921], - [895, 5, 2283, "Metrics/MethodLength: Method has too many lines. [57/10]", 2282416447], - [955, 5, 2654, "Metrics/MethodLength: Method has too many lines. [63/10]", 2491520565], - [1006, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 1823519875], - [1015, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 1874311968], - [1021, 5, 10660, "Metrics/AbcSize: Assignment Branch Condition size for `ruby_downstream_merge_gem_feature_matrix` is too high. [<0, 21, 0> 21/17]", 2277322577], - [1021, 5, 10660, "Metrics/MethodLength: Method has too many lines. [248/10]", 2277322577], - [1272, 5, 1546, "Metrics/MethodLength: Method has too many lines. [37/10]", 208933754], - [1306, 121, 33, "Layout/LineLength: Line is too long. [153/120]", 2658452668], - [1312, 5, 4206, "Metrics/MethodLength: Method has too many lines. [96/10]", 1997530776], - [1389, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 183246985], - [1405, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 3268438356], - [1411, 5, 1598, "Metrics/MethodLength: Method has too many lines. [46/10]", 849757258], - [1454, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1323237892], - [1460, 5, 1164, "Metrics/MethodLength: Method has too many lines. [36/10]", 1477831421], - [1493, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 931876829], - [1499, 5, 1699, "Metrics/MethodLength: Method has too many lines. [43/10]", 1125544678], - [1545, 5, 1016, "Metrics/MethodLength: Method has too many lines. [27/10]", 2194427985], - [1575, 5, 1058, "Metrics/MethodLength: Method has too many lines. [30/10]", 47860722], - [1608, 5, 1186, "Metrics/MethodLength: Method has too many lines. [31/10]", 676863486], - [1636, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 2689509078], - [1642, 5, 1517, "Metrics/MethodLength: Method has too many lines. [41/10]", 3855445172], - [1655, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 817380904], - [1680, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 409671963], - [1686, 5, 2116, "Metrics/MethodLength: Method has too many lines. [61/10]", 524104794], - [1750, 5, 820, "Metrics/MethodLength: Method has too many lines. [12/10]", 1888457180], - [1750, 37, 298, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [10/5]", 789483382], - [1751, 121, 100, "Layout/LineLength: Line is too long. [220/120]", 3288750271], - [1766, 5, 3595, "Metrics/AbcSize: Assignment Branch Condition size for `initial_profile_promotion_policy` is too high. [<9, 20, 0> 21.93/17]", 83685787], - [1766, 5, 3595, "Metrics/MethodLength: Method has too many lines. [77/10]", 83685787], - [1846, 5, 768, "Metrics/MethodLength: Method has too many lines. [17/10]", 314059802], - [1867, 5, 1493, "Metrics/AbcSize: Assignment Branch Condition size for `evaluate_profile_selection_requirement` is too high. [<7, 23, 9> 25.67/17]", 3177555163], - [1867, 5, 1493, "Metrics/MethodLength: Method has too many lines. [29/10]", 3177555163], - [1868, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 2145168012], - [1875, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 683002336], - [1909, 5, 985, "Metrics/AbcSize: Assignment Branch Condition size for `profile_promotion_blocking_reasons` is too high. [<4, 25, 13> 28.46/17]", 1146627465], - [1909, 5, 985, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `profile_promotion_blocking_reasons` is too high. [10/7]", 1146627465], - [1909, 5, 985, "Metrics/MethodLength: Method has too many lines. [18/10]", 1146627465], - [1909, 5, 985, "Metrics/PerceivedComplexity: Perceived complexity for `profile_promotion_blocking_reasons` is too high. [10/8]", 1146627465], - [1930, 5, 3173, "Metrics/AbcSize: Assignment Branch Condition size for `validate_language_backend_profile` is too high. [<25, 68, 20> 75.16/17]", 2100389324], - [1930, 5, 3173, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `validate_language_backend_profile` is too high. [21/7]", 2100389324], - [1930, 5, 3173, "Metrics/MethodLength: Method has too many lines. [60/10]", 2100389324], - [1930, 5, 3173, "Metrics/PerceivedComplexity: Perceived complexity for `validate_language_backend_profile` is too high. [23/8]", 2100389324], - [2002, 5, 1523, "Metrics/AbcSize: Assignment Branch Condition size for `validate_backend_inventory` is too high. [<13, 38, 13> 42.21/17]", 1899037537], - [2002, 5, 1523, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `validate_backend_inventory` is too high. [13/7]", 1899037537], - [2002, 5, 1523, "Metrics/MethodLength: Method has too many lines. [25/10]", 1899037537], - [2002, 5, 1523, "Metrics/PerceivedComplexity: Perceived complexity for `validate_backend_inventory` is too high. [13/8]", 1899037537], - [2045, 5, 906, "Metrics/MethodLength: Method has too many lines. [20/10]", 3137959843], - [2068, 5, 2744, "Metrics/AbcSize: Assignment Branch Condition size for `detect_raw_merge_inconsistencies` is too high. [<8, 43, 21> 48.52/17]", 3717440692], - [2068, 5, 2744, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `detect_raw_merge_inconsistencies` is too high. [17/7]", 3717440692], - [2068, 5, 2744, "Metrics/MethodLength: Method has too many lines. [53/10]", 3717440692], - [2068, 5, 2744, "Metrics/PerceivedComplexity: Perceived complexity for `detect_raw_merge_inconsistencies` is too high. [17/8]", 3717440692], - [2083, 7, 1894, "Metrics/BlockLength: Block has too many lines. [33/25]", 758887611], - [2129, 5, 762, "Metrics/MethodLength: Method has too many lines. [11/10]", 3021402342], - [2143, 5, 490, "Metrics/MethodLength: Method has too many lines. [11/10]", 578473475], - [2157, 5, 881, "Metrics/AbcSize: Assignment Branch Condition size for `execute_independent_commutative_insertions` is too high. [<6, 16, 7> 18.47/17]", 259417386], - [2157, 5, 881, "Metrics/MethodLength: Method has too many lines. [21/10]", 259417386], - [2184, 5, 1107, "Metrics/AbcSize: Assignment Branch Condition size for `execute_independent_keyed_member_edits` is too high. [<10, 31, 15> 35.86/17]", 4271501385], - [2184, 5, 1107, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `execute_independent_keyed_member_edits` is too high. [14/7]", 4271501385], - [2184, 5, 1107, "Metrics/MethodLength: Method has too many lines. [24/10]", 4271501385], - [2184, 5, 1107, "Metrics/PerceivedComplexity: Perceived complexity for `execute_independent_keyed_member_edits` is too high. [14/8]", 4271501385], - [2228, 5, 3149, "Metrics/AbcSize: Assignment Branch Condition size for `parse_compact_ruleset` is too high. [<16, 68, 24> 73.86/17]", 3149098803], - [2228, 5, 3149, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `parse_compact_ruleset` is too high. [22/7]", 3149098803], - [2228, 5, 3149, "Metrics/MethodLength: Method has too many lines. [67/10]", 3149098803], - [2228, 5, 3149, "Metrics/PerceivedComplexity: Perceived complexity for `parse_compact_ruleset` is too high. [23/8]", 3149098803], - [2234, 7, 2544, "Metrics/BlockLength: Block has too many lines. [50/25]", 2484860466], - [2261, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193420054], - [2307, 5, 2658, "Metrics/AbcSize: Assignment Branch Condition size for `compact_ruleset_feature_profile` is too high. [<11, 67, 38> 77.81/17]", 4022599673], - [2307, 5, 2658, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `compact_ruleset_feature_profile` is too high. [29/7]", 4022599673], - [2307, 5, 2658, "Metrics/MethodLength: Method has too many lines. [66/10]", 4022599673], - [2307, 5, 2658, "Metrics/PerceivedComplexity: Perceived complexity for `compact_ruleset_feature_profile` is too high. [16/8]", 4022599673], - [2325, 7, 2243, "Metrics/BlockLength: Block has too many lines. [47/25]", 965041772], - [2392, 5, 2733, "Metrics/AbcSize: Assignment Branch Condition size for `classify_template_target_path` is too high. [<4, 36, 23> 42.91/17]", 3661828596], - [2392, 5, 2733, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `classify_template_target_path` is too high. [21/7]", 3661828596], - [2392, 5, 2733, "Metrics/MethodLength: Method has too many lines. [39/10]", 3661828596], - [2392, 5, 2733, "Metrics/PerceivedComplexity: Perceived complexity for `classify_template_target_path` is too high. [17/8]", 3661828596], - [2424, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], - [2438, 5, 416, "Metrics/MethodLength: Method has too many lines. [12/10]", 1388641773], - [2481, 5, 388, "Metrics/MethodLength: Method has too many lines. [12/10]", 2360583514], - [2510, 5, 820, "Metrics/MethodLength: Method has too many lines. [13/10]", 354674808], - [2526, 5, 929, "Metrics/AbcSize: Assignment Branch Condition size for `enrich_template_plan_entries` is too high. [<9, 12, 10> 18.03/17]", 2666747528], - [2526, 5, 929, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `enrich_template_plan_entries` is too high. [9/7]", 2666747528], - [2526, 5, 929, "Metrics/MethodLength: Method has too many lines. [19/10]", 2666747528], - [2526, 5, 929, "Metrics/PerceivedComplexity: Perceived complexity for `enrich_template_plan_entries` is too high. [10/8]", 2666747528], - [2549, 5, 1245, "Metrics/AbcSize: Assignment Branch Condition size for `enrich_template_plan_entries_with_token_state` is too high. [<11, 23, 14> 29.09/17]", 1507113977], - [2549, 5, 1245, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `enrich_template_plan_entries_with_token_state` is too high. [13/7]", 1507113977], - [2549, 5, 1245, "Metrics/MethodLength: Method has too many lines. [19/10]", 1507113977], - [2549, 5, 1245, "Metrics/PerceivedComplexity: Perceived complexity for `enrich_template_plan_entries_with_token_state` is too high. [13/8]", 1507113977], - [2573, 5, 1353, "Metrics/AbcSize: Assignment Branch Condition size for `prepare_template_entries` is too high. [<6, 18, 11> 21.93/17]", 2774310942], - [2573, 5, 1353, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `prepare_template_entries` is too high. [11/7]", 2774310942], - [2573, 5, 1353, "Metrics/MethodLength: Method has too many lines. [24/10]", 2774310942], - [2573, 5, 1353, "Metrics/PerceivedComplexity: Perceived complexity for `prepare_template_entries` is too high. [12/8]", 2774310942], - [2603, 5, 1494, "Metrics/AbcSize: Assignment Branch Condition size for `plan_template_execution` is too high. [<8, 22, 17> 28.93/17]", 3876421385], - [2603, 5, 1494, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `plan_template_execution` is too high. [14/7]", 3876421385], - [2603, 5, 1494, "Metrics/MethodLength: Method has too many lines. [29/10]", 3876421385], - [2603, 5, 1494, "Metrics/PerceivedComplexity: Perceived complexity for `plan_template_execution` is too high. [15/8]", 3876421385], - [2604, 7, 1421, "Metrics/BlockLength: Block has too many lines. [27/25]", 2887810383], - [2637, 5, 822, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 2749235529], - [2637, 37, 220, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 447165880], - [2638, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 518382509], - [2652, 5, 2060, "Metrics/AbcSize: Assignment Branch Condition size for `preview_template_execution` is too high. [<11, 42, 26> 50.61/17]", 2270817206], - [2652, 5, 2060, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `preview_template_execution` is too high. [25/7]", 2270817206], - [2652, 5, 2060, "Metrics/MethodLength: Method has too many lines. [39/10]", 2270817206], - [2652, 5, 2060, "Metrics/PerceivedComplexity: Perceived complexity for `preview_template_execution` is too high. [23/8]", 2270817206], - [2662, 7, 1809, "Metrics/BlockLength: Block has too many lines. [28/25]", 310337564], - [2700, 5, 2513, "Metrics/AbcSize: Assignment Branch Condition size for `apply_template_execution` is too high. [<14, 50, 25> 57.63/17]", 177708331], - [2700, 5, 2513, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `apply_template_execution` is too high. [26/7]", 177708331], - [2700, 5, 2513, "Metrics/MethodLength: Method has too many lines. [50/10]", 177708331], - [2700, 5, 2513, "Metrics/PerceivedComplexity: Perceived complexity for `apply_template_execution` is too high. [23/8]", 177708331], - [2711, 7, 2239, "Metrics/BlockLength: Block has too many lines. [38/25]", 1651205014], - [2761, 5, 1696, "Metrics/AbcSize: Assignment Branch Condition size for `evaluate_template_tree_convergence` is too high. [<11, 29, 17> 35.37/17]", 2507998041], - [2761, 5, 1696, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `evaluate_template_tree_convergence` is too high. [17/7]", 2507998041], - [2761, 5, 1696, "Metrics/MethodLength: Method has too many lines. [35/10]", 2507998041], - [2761, 5, 1696, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 2507998041], - [2761, 5, 1696, "Metrics/PerceivedComplexity: Perceived complexity for `evaluate_template_tree_convergence` is too high. [17/8]", 2507998041], - [2761, 43, 198, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 4214374277], - [2762, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 2983874608], - [2804, 5, 688, "Metrics/MethodLength: Method has too many lines. [15/10]", 3064253784], - [2804, 5, 688, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 3064253784], - [2804, 36, 216, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 448029307], - [2805, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 3840139076], - [2848, 5, 664, "Metrics/MethodLength: Method has too many lines. [13/10]", 995637868], - [2848, 5, 664, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 995637868], - [2848, 53, 202, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 4227116196], - [2849, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 418683952], - [2866, 5, 649, "Metrics/MethodLength: Method has too many lines. [13/10]", 1831524792], - [2866, 5, 649, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 1831524792], - [2866, 54, 178, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 2962381850], - [2867, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 3690915627], - [2884, 5, 1280, "Metrics/AbcSize: Assignment Branch Condition size for `apply_template_tree_execution_to_directory` is too high. [<6, 16, 6> 18.11/17]", 305449363], - [2884, 5, 1280, "Metrics/MethodLength: Method has too many lines. [23/10]", 305449363], - [2884, 5, 1280, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 305449363], - [2884, 51, 200, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 1352434212], - [2885, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 1139621482], - [2913, 5, 2199, "Metrics/AbcSize: Assignment Branch Condition size for `report_template_tree_run` is too high. [<15, 42, 31> 54.31/17]", 975627723], - [2913, 5, 2199, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `report_template_tree_run` is too high. [25/7]", 975627723], - [2913, 5, 2199, "Metrics/MethodLength: Method has too many lines. [38/10]", 975627723], - [2913, 5, 2199, "Metrics/PerceivedComplexity: Perceived complexity for `report_template_tree_run` is too high. [26/8]", 975627723], - [2957, 5, 1515, "Metrics/AbcSize: Assignment Branch Condition size for `report_template_directory_apply` is too high. [<13, 35, 21> 42.84/17]", 3710254295], - [2957, 5, 1515, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `report_template_directory_apply` is too high. [17/7]", 3710254295], - [2957, 5, 1515, "Metrics/MethodLength: Method has too many lines. [26/10]", 3710254295], - [2957, 5, 1515, "Metrics/PerceivedComplexity: Perceived complexity for `report_template_directory_apply` is too high. [17/8]", 3710254295], - [2972, 20, 1, "Style/DoubleNegation: Avoid the use of double negation (`!!`).", 177540], - [2989, 5, 1656, "Metrics/AbcSize: Assignment Branch Condition size for `report_template_directory_plan` is too high. [<11, 24, 25> 36.36/17]", 2946319293], - [2989, 5, 1656, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `report_template_directory_plan` is too high. [18/7]", 2946319293], - [2989, 5, 1656, "Metrics/MethodLength: Method has too many lines. [36/10]", 2946319293], - [2989, 5, 1656, "Metrics/PerceivedComplexity: Perceived complexity for `report_template_directory_plan` is too high. [16/8]", 2946319293], - [3061, 7, 9, "Style/MultilineBlockChain: Avoid multi-line chains of blocks.", 3648222389], - [3082, 5, 410, "Metrics/MethodLength: Method has too many lines. [12/10]", 248324428], - [3088, 7, 11, "Style/MultilineBlockChain: Avoid multi-line chains of blocks.", 848344986], - [3132, 5, 712, "Metrics/MethodLength: Method has too many lines. [12/10]", 2500743043], - [3132, 27, 178, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 873705194], - [3132, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3023611470], - [3158, 42, 167, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 2002181571], - [3171, 5, 1097, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `structured_edit_selection_profile` is too high. [8/7]", 1149325233], - [3171, 5, 1097, "Metrics/MethodLength: Method has too many lines. [14/10]", 1149325233], - [3171, 42, 311, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [11/5]", 3814063337], - [3172, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 198450264], - [3185, 34, 47, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 3204815976], - [3190, 5, 869, "Metrics/MethodLength: Method has too many lines. [11/10]", 83957392], - [3190, 41, 250, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 1486072775], - [3191, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 1967186495], - [3201, 36, 47, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 3204815976], - [3206, 5, 1156, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `structured_edit_match_profile` is too high. [10/7]", 4112674787], - [3206, 5, 1156, "Metrics/MethodLength: Method has too many lines. [15/10]", 4112674787], - [3206, 5, 1156, "Metrics/PerceivedComplexity: Perceived complexity for `structured_edit_match_profile` is too high. [10/8]", 4112674787], - [3206, 38, 321, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [12/5]", 823565876], - [3207, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5859667], - [3208, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3673982236], - [3226, 5, 933, "Metrics/MethodLength: Method has too many lines. [14/10]", 2099388915], - [3226, 37, 319, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [12/5]", 250907892], - [3227, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177545], - [3228, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 4154814685], - [3245, 5, 907, "Metrics/MethodLength: Method has too many lines. [12/10]", 2242846328], - [3245, 42, 275, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 246196330], - [3246, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 1439117336], - [3262, 5, 1057, "Metrics/MethodLength: Method has too many lines. [14/10]", 2891607970], - [3262, 44, 323, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [11/5]", 1386547750], - [3263, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 1676243675], - [3264, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 4154814685], - [3281, 5, 1375, "Metrics/AbcSize: Assignment Branch Condition size for `structured_edit_request` is too high. [<11, 25, 10> 29.09/17]", 4153786554], - [3281, 5, 1375, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `structured_edit_request` is too high. [11/7]", 4153786554], - [3281, 5, 1375, "Metrics/MethodLength: Method has too many lines. [16/10]", 4153786554], - [3281, 5, 1375, "Metrics/PerceivedComplexity: Perceived complexity for `structured_edit_request` is too high. [11/8]", 4153786554], - [3281, 32, 370, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [13/5]", 2381882467], - [3282, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177545], - [3303, 5, 728, "Metrics/MethodLength: Method has too many lines. [11/10]", 4026157473], - [3303, 31, 175, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 773121544], - [3335, 5, 597, "Metrics/MethodLength: Method has too many lines. [11/10]", 4143495860], - [3374, 5, 577, "Metrics/MethodLength: Method has too many lines. [11/10]", 4169131743], - [3389, 5, 1011, "Metrics/AbcSize: Assignment Branch Condition size for `structured_edit_execution_report` is too high. [<7, 16, 7> 18.81/17]", 876221899], - [3389, 5, 1011, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `structured_edit_execution_report` is too high. [8/7]", 876221899], - [3389, 5, 1011, "Metrics/MethodLength: Method has too many lines. [12/10]", 876221899], - [3389, 41, 245, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 2484440861], - [3390, 121, 55, "Layout/LineLength: Line is too long. [175/120]", 4036992717], - [3415, 55, 170, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 668161765], - [3438, 5, 819, "Metrics/MethodLength: Method has too many lines. [12/10]", 2287133436], - [3438, 56, 217, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 3198032135], - [3439, 121, 51, "Layout/LineLength: Line is too long. [171/120]", 3526181051], - [3472, 5, 663, "Metrics/MethodLength: Method has too many lines. [11/10]", 1853778635], - [3481, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2162352564], - [3513, 5, 663, "Metrics/MethodLength: Method has too many lines. [11/10]", 1132214891], - [3522, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2162352564], - [3544, 5, 678, "Metrics/MethodLength: Method has too many lines. [11/10]", 556747511], - [3553, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 1808630920], - [3575, 5, 708, "Metrics/MethodLength: Method has too many lines. [11/10]", 3590891170], - [3584, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1367166441], - [3607, 5, 678, "Metrics/MethodLength: Method has too many lines. [11/10]", 689748855], - [3616, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 1808630920], - [3638, 5, 708, "Metrics/MethodLength: Method has too many lines. [11/10]", 1478642210], - [3647, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1367166441], - [3671, 5, 663, "Metrics/MethodLength: Method has too many lines. [11/10]", 239506091], - [3680, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2162352564], - [3702, 5, 693, "Metrics/MethodLength: Method has too many lines. [11/10]", 3803476550], - [3711, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 926808928], - [3734, 5, 728, "Metrics/MethodLength: Method has too many lines. [11/10]", 748161230], - [3743, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 2807086497], - [3765, 5, 758, "Metrics/MethodLength: Method has too many lines. [11/10]", 3900524558], - [3774, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3463884836], - [3798, 5, 748, "Metrics/MethodLength: Method has too many lines. [11/10]", 2076716686], - [3807, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 609414023], - [3829, 5, 778, "Metrics/MethodLength: Method has too many lines. [11/10]", 867958318], - [3833, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193343749], - [3838, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 1202823007], - [3862, 5, 728, "Metrics/MethodLength: Method has too many lines. [11/10]", 2078323790], - [3871, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 2807086497], - [3893, 5, 758, "Metrics/MethodLength: Method has too many lines. [11/10]", 121025422], - [3902, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3463884836], - [3924, 5, 733, "Metrics/MethodLength: Method has too many lines. [11/10]", 1216456558], - [3933, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 145839927], - [3955, 5, 763, "Metrics/MethodLength: Method has too many lines. [11/10]", 2946525998], - [3964, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 275709226], - [3988, 5, 768, "Metrics/MethodLength: Method has too many lines. [11/10]", 3281402414], - [3992, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177656], - [3997, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 1427340581], - [4034, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3673982236], - [4091, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193417070], - [4102, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 2768444], - [4109, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3833204035], - [4117, 5, 863, "Metrics/MethodLength: Method has too many lines. [11/10]", 3731153486], - [4121, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 4054494590], - [4126, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 2084326338], - [4132, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 4201858364], - [4136, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861122], - [4140, 5, 873, "Metrics/MethodLength: Method has too many lines. [11/10]", 1866057614], - [4144, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 3893180930], - [4149, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 863421408], - [4155, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 3247130491], - [4159, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1171438608], - [4163, 5, 883, "Metrics/MethodLength: Method has too many lines. [11/10]", 2352924462], - [4163, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860841], - [4164, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861334], - [4167, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 465221046], - [4172, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 1922522532], - [4188, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 4067226670], - [4192, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2033573170], - [4196, 5, 893, "Metrics/MethodLength: Method has too many lines. [11/10]", 1633175534], - [4196, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087926422], - [4197, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087421565], - [4200, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 615151909], - [4205, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 884393597], - [4231, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 417844693], - [4235, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1233681340], - [4239, 5, 903, "Metrics/MethodLength: Method has too many lines. [11/10]", 3964877742], - [4239, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1165873471], - [4240, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1322899615], - [4243, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 3471008807], - [4248, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 627945471], - [4254, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 2960084092], - [4258, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 2148514258], - [4262, 5, 913, "Metrics/MethodLength: Method has too many lines. [11/10]", 385546958], - [4262, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2970472935], - [4263, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 3808956371], - [4266, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 3412499338], - [4271, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 3274208144], - [4277, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 4275923717], - [4285, 5, 848, "Metrics/MethodLength: Method has too many lines. [11/10]", 457851502], - [4289, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 413805135], - [4294, 121, 45, "Layout/LineLength: Line is too long. [165/120]", 951908917], - [4300, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 1859200227], - [4308, 5, 808, "Metrics/MethodLength: Method has too many lines. [11/10]", 884695726], - [4312, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 2011807620], - [4317, 121, 37, "Layout/LineLength: Line is too long. [157/120]", 384138219], - [4323, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1176320663], - [4331, 5, 798, "Metrics/MethodLength: Method has too many lines. [11/10]", 1422521838], - [4335, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3247420006], - [4340, 121, 35, "Layout/LineLength: Line is too long. [155/120]", 1408316702], - [4346, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 938465266], - [4354, 5, 803, "Metrics/MethodLength: Method has too many lines. [11/10]", 2370839950], - [4358, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 74128911], - [4363, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 1364659899], - [4369, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2059517661], - [4377, 5, 803, "Metrics/MethodLength: Method has too many lines. [11/10]", 3379336814], - [4381, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 74128911], - [4386, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 1364659899], - [4434, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 4281772560], - [4442, 5, 833, "Metrics/MethodLength: Method has too many lines. [11/10]", 3245498510], - [4446, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3542644754], - [4451, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 1916814773], - [4457, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 859690879], - [4465, 5, 833, "Metrics/MethodLength: Method has too many lines. [11/10]", 4138830126], - [4469, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3542644754], - [4474, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 1916814773], - [4480, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 3880141603], - [4488, 5, 828, "Metrics/MethodLength: Method has too many lines. [11/10]", 3621010990], - [4492, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3917260126], - [4497, 121, 41, "Layout/LineLength: Line is too long. [161/120]", 1879260859], - [4503, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 1776611011], - [4511, 5, 838, "Metrics/MethodLength: Method has too many lines. [11/10]", 514585454], - [4515, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1353518231], - [4520, 121, 43, "Layout/LineLength: Line is too long. [163/120]", 1228459824], - [4526, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 3932349968], - [4530, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087903307], - [4534, 5, 878, "Metrics/MethodLength: Method has too many lines. [11/10]", 1525737454], - [4534, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177548], - [4535, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177538], - [4538, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 2895681070], - [4543, 121, 51, "Layout/LineLength: Line is too long. [171/120]", 4040662298], - [4549, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 66929045], - [4557, 5, 808, "Metrics/MethodLength: Method has too many lines. [11/10]", 1626746606], - [4561, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 2011807620], - [4566, 121, 37, "Layout/LineLength: Line is too long. [157/120]", 384138219], - [4580, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 849230508], - [4588, 5, 838, "Metrics/MethodLength: Method has too many lines. [11/10]", 3531122670], - [4592, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1353518231], - [4597, 121, 43, "Layout/LineLength: Line is too long. [163/120]", 1228459824], - [4612, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1176320663], - [4620, 5, 798, "Metrics/MethodLength: Method has too many lines. [11/10]", 1118421486], - [4624, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3247420006], - [4629, 121, 35, "Layout/LineLength: Line is too long. [155/120]", 1408316702], - [4651, 5, 693, "Metrics/MethodLength: Method has too many lines. [11/10]", 1668406662], - [4660, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 926808928], - [4674, 5, 648, "Metrics/MethodLength: Method has too many lines. [11/10]", 3479836893], - [4683, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193343749], - [4705, 5, 678, "Metrics/MethodLength: Method has too many lines. [11/10]", 3147549879], - [4714, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 1808630920], - [4749, 5, 677, "Metrics/MethodLength: Method has too many lines. [11/10]", 1206941784], - [4758, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3937819337], - [4781, 5, 672, "Metrics/MethodLength: Method has too many lines. [11/10]", 3634903061], - [4790, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2162352564], - [4812, 5, 683, "Metrics/MethodLength: Method has too many lines. [11/10]", 3417053461], - [4821, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 926808928], - [4845, 5, 668, "Metrics/MethodLength: Method has too many lines. [11/10]", 1540762726], - [4854, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 1808630920], - [4876, 5, 698, "Metrics/MethodLength: Method has too many lines. [11/10]", 2804825893], - [4885, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1367166441], - [4908, 5, 683, "Metrics/MethodLength: Method has too many lines. [11/10]", 3165010613], - [4917, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 926808928], - [4939, 5, 713, "Metrics/MethodLength: Method has too many lines. [11/10]", 2795628035], - [4948, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 497133415], - [4954, 5, 864, "Metrics/MethodLength: Method has too many lines. [12/10]", 1086224878], - [4954, 50, 268, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 4022739767], - [4955, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1607400384], - [4979, 5, 658, "Metrics/MethodLength: Method has too many lines. [11/10]", 3999796489], - [4988, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 102058825], - [5002, 59, 179, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 1569981428], - [5003, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 1515849732], - [5034, 5, 694, "Metrics/MethodLength: Method has too many lines. [11/10]", 3830236120], - [5043, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2250857971], - [5057, 5, 673, "Metrics/MethodLength: Method has too many lines. [11/10]", 2413908653], - [5066, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1225026887], - [5080, 5, 663, "Metrics/MethodLength: Method has too many lines. [11/10]", 3935895659], - [5089, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2162352564], - [5103, 5, 692, "Metrics/MethodLength: Method has too many lines. [11/10]", 3660669627], - [5112, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3558241761], - [5126, 5, 612, "Metrics/MethodLength: Method has too many lines. [11/10]", 100391811], - [5165, 5, 693, "Metrics/MethodLength: Method has too many lines. [11/10]", 3138587622], - [5174, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 926808928], - [5196, 5, 688, "Metrics/MethodLength: Method has too many lines. [11/10]", 2736088861], - [5205, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 1992103013], - [5228, 5, 678, "Metrics/MethodLength: Method has too many lines. [11/10]", 2275602867], - [5237, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 3598350322], - [5260, 5, 602, "Metrics/MethodLength: Method has too many lines. [11/10]", 3023166371], - [5275, 36, 181, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 1071580945], - [5288, 5, 787, "Metrics/AbcSize: Assignment Branch Condition size for `group_projected_child_review_cases` is too high. [<4, 17, 4> 17.92/17]", 3391527151], - [5288, 5, 787, "Metrics/MethodLength: Method has too many lines. [18/10]", 3391527151], - [5312, 5, 705, "Metrics/MethodLength: Method has too many lines. [13/10]", 2629923275], - [5339, 5, 547, "Metrics/MethodLength: Method has too many lines. [12/10]", 1911190850], - [5364, 5, 1516, "Metrics/AbcSize: Assignment Branch Condition size for `review_projected_child_groups` is too high. [<11, 21, 9> 25.36/17]", 3333110579], - [5364, 5, 1516, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `review_projected_child_groups` is too high. [8/7]", 3333110579], - [5364, 5, 1516, "Metrics/MethodLength: Method has too many lines. [39/10]", 3333110579], - [5364, 5, 1516, "Metrics/PerceivedComplexity: Perceived complexity for `review_projected_child_groups` is too high. [9/8]", 3333110579], - [5398, 7, 7, "Style/MultilineBlockChain: Avoid multi-line chains of blocks.", 4045560504], - [5410, 5, 562, "Metrics/MethodLength: Method has too many lines. [14/10]", 3083915102], - [5429, 5, 1898, "Metrics/AbcSize: Assignment Branch Condition size for `resolve_delegated_child_outputs` is too high. [<11, 21, 6> 24.45/17]", 2739722546], - [5429, 5, 1898, "Metrics/MethodLength: Method has too many lines. [49/10]", 2739722546], - [5484, 5, 942, "Metrics/AbcSize: Assignment Branch Condition size for `execute_nested_merge` is too high. [<3, 17, 6> 18.28/17]", 766157172], - [5484, 5, 942, "Metrics/MethodLength: Method has too many lines. [20/10]", 766157172], - [5484, 29, 144, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 1404367793], - [5511, 5, 652, "Metrics/MethodLength: Method has too many lines. [13/10]", 2105803856], - [5530, 38, 140, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 1682835820], - [5560, 5, 577, "Metrics/MethodLength: Method has too many lines. [12/10]", 2659610443], - [5629, 5, 569, "Metrics/MethodLength: Method has too many lines. [14/10]", 20616641], - [5657, 5, 772, "Metrics/AbcSize: Assignment Branch Condition size for `conformance_manifest_review_request_ids` is too high. [<7, 16, 8> 19.21/17]", 3577418475], - [5657, 5, 772, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `conformance_manifest_review_request_ids` is too high. [9/7]", 3577418475], - [5657, 5, 772, "Metrics/MethodLength: Method has too many lines. [14/10]", 3577418475], - [5657, 5, 772, "Metrics/PerceivedComplexity: Perceived complexity for `conformance_manifest_review_request_ids` is too high. [9/8]", 3577418475], - [5711, 5, 606, "Metrics/MethodLength: Method has too many lines. [11/10]", 2675086662], - [5726, 5, 562, "Metrics/MethodLength: Method has too many lines. [11/10]", 3811715870], - [5741, 5, 578, "Metrics/MethodLength: Method has too many lines. [11/10]", 1776197415], - [5756, 5, 1298, "Metrics/AbcSize: Assignment Branch Condition size for `resolve_conformance_family_context` is too high. [<7, 28, 9> 30.23/17]", 4265202259], - [5756, 5, 1298, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `resolve_conformance_family_context` is too high. [10/7]", 4265202259], - [5756, 5, 1298, "Metrics/MethodLength: Method has too many lines. [23/10]", 4265202259], - [5756, 5, 1298, "Metrics/PerceivedComplexity: Perceived complexity for `resolve_conformance_family_context` is too high. [10/8]", 4265202259], - [5785, 5, 1994, "Metrics/AbcSize: Assignment Branch Condition size for `review_conformance_family_context` is too high. [<12, 24, 10> 28.64/17]", 2834851944], - [5785, 5, 1994, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `review_conformance_family_context` is too high. [10/7]", 2834851944], - [5785, 5, 1994, "Metrics/MethodLength: Method has too many lines. [41/10]", 2834851944], - [5785, 5, 1994, "Metrics/PerceivedComplexity: Perceived complexity for `review_conformance_family_context` is too high. [11/8]", 2834851944], - [5808, 121, 33, "Layout/LineLength: Line is too long. [153/120]", 641612328], - [5845, 5, 1844, "Metrics/AbcSize: Assignment Branch Condition size for `select_conformance_case` is too high. [<2, 43, 14> 45.27/17]", 670673209], - [5845, 5, 1844, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `select_conformance_case` is too high. [14/7]", 670673209], - [5845, 5, 1844, "Metrics/MethodLength: Method has too many lines. [30/10]", 670673209], - [5845, 5, 1844, "Metrics/PerceivedComplexity: Perceived complexity for `select_conformance_case` is too high. [16/8]", 670673209], - [5850, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 2135503892], - [5852, 121, 41, "Layout/LineLength: Line is too long. [161/120]", 3932054828], - [5861, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 3169124957], - [5883, 5, 509, "Metrics/MethodLength: Method has too many lines. [11/10]", 3552283123], - [5972, 5, 4195, "Metrics/AbcSize: Assignment Branch Condition size for `review_conformance_manifest` is too high. [<37, 63, 16> 74.79/17]", 2166560528], - [5972, 5, 4195, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `review_conformance_manifest` is too high. [14/7]", 2166560528], - [5972, 5, 4195, "Metrics/MethodLength: Method has too many lines. [89/10]", 2166560528], - [5972, 5, 4195, "Metrics/PerceivedComplexity: Perceived complexity for `review_conformance_manifest` is too high. [17/8]", 2166560528], - [6037, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2746826653], - [6053, 121, 47, "Layout/LineLength: Line is too long. [167/120]", 3035993839], - [6075, 5, 676, "Metrics/MethodLength: Method has too many lines. [15/10]", 3048335475], - [6098, 5, 1054, "Metrics/AbcSize: Assignment Branch Condition size for `plan_conformance_suite` is too high. [<11, 18, 8> 22.56/17]", 1855254788], - [6098, 5, 1054, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `plan_conformance_suite` is too high. [8/7]", 1855254788], - [6098, 5, 1054, "Metrics/MethodLength: Method has too many lines. [25/10]", 1855254788], - [6098, 31, 84, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 172854173], - [6163, 5, 1274, "Metrics/AbcSize: Assignment Branch Condition size for `plan_named_conformance_suites_with_diagnostics` is too high. [<11, 21, 7> 24.72/17]", 3991300730], - [6163, 5, 1274, "Metrics/MethodLength: Method has too many lines. [27/10]", 3991300730], - [6190, 121, 47, "Layout/LineLength: Line is too long. [167/120]", 3035993839], - [6255, 5, 2071, "Metrics/AbcSize: Assignment Branch Condition size for `review_decision_for_family_context` is too high. [<7, 22, 16> 28.09/17]", 4245377184], - [6255, 5, 2071, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `review_decision_for_family_context` is too high. [12/7]", 4245377184], - [6255, 5, 2071, "Metrics/MethodLength: Method has too many lines. [46/10]", 4245377184], - [6255, 5, 2071, "Metrics/PerceivedComplexity: Perceived complexity for `review_decision_for_family_context` is too high. [12/8]", 4245377184], - [6260, 7, 1766, "Metrics/BlockLength: Block has too many lines. [40/25]", 65448241], - [6312, 5, 686, "Metrics/MethodLength: Method has too many lines. [13/10]", 4030291682] + [164, 7, 337, "Metrics/MethodLength: Method has too many lines. [11/10]", 2388996629], + [181, 7, 327, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `to_h` is too high. [8/7]", 979795121], + [312, 7, 383, "Metrics/MethodLength: Method has too many lines. [11/10]", 634650261], + [476, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 3450568485], + [477, 7, 461, "Metrics/MethodLength: Method has too many lines. [12/10]", 43929779], + [494, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1299979089], + [495, 7, 377, "Metrics/MethodLength: Method has too many lines. [11/10]", 3704151253], + [511, 121, 39, "Layout/LineLength: Line is too long. [159/120]", 85503958], + [512, 7, 447, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `to_h` is too high. [8/7]", 298553749], + [512, 7, 447, "Metrics/MethodLength: Method has too many lines. [12/10]", 298553749], + [541, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 1441148616], + [542, 7, 453, "Metrics/MethodLength: Method has too many lines. [14/10]", 1899007021], + [561, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193342990], + [562, 7, 400, "Metrics/MethodLength: Method has too many lines. [11/10]", 298553749], + [591, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860750], + [592, 7, 411, "Metrics/MethodLength: Method has too many lines. [12/10]", 2893925621], + [609, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3137791633], + [610, 7, 454, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `to_h` is too high. [8/7]", 298553749], + [610, 7, 454, "Metrics/MethodLength: Method has too many lines. [12/10]", 298553749], + [669, 7, 385, "Metrics/MethodLength: Method has too many lines. [11/10]", 794265461], + [706, 7, 419, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `to_h` is too high. [10/7]", 3313546353], + [706, 7, 419, "Metrics/PerceivedComplexity: Perceived complexity for `to_h` is too high. [10/8]", 3313546353], + [756, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 398187770], + [768, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 2746783933], + [815, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860841], + [823, 121, 156, "Layout/LineLength: Line is too long. [276/120]", 1149525480], + [828, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 2538424426], + [840, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 2285382915], + [850, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3962419360], + [863, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 398187770], + [865, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 3195178507], + [869, 121, 85, "Layout/LineLength: Line is too long. [205/120]", 4238980637], + [871, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 2678411233], + [873, 121, 39, "Layout/LineLength: Line is too long. [159/120]", 4028520110], + [884, 121, 110, "Layout/LineLength: Line is too long. [230/120]", 3837814921], + [898, 5, 2283, "Metrics/MethodLength: Method has too many lines. [57/10]", 2282416447], + [958, 5, 2654, "Metrics/MethodLength: Method has too many lines. [63/10]", 2491520565], + [1009, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 1823519875], + [1018, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 1874311968], + [1024, 5, 10660, "Metrics/AbcSize: Assignment Branch Condition size for `ruby_downstream_merge_gem_feature_matrix` is too high. [<0, 21, 0> 21/17]", 2277322577], + [1024, 5, 10660, "Metrics/MethodLength: Method has too many lines. [248/10]", 2277322577], + [1275, 5, 1546, "Metrics/MethodLength: Method has too many lines. [37/10]", 208933754], + [1309, 121, 33, "Layout/LineLength: Line is too long. [153/120]", 2658452668], + [1315, 5, 4206, "Metrics/MethodLength: Method has too many lines. [96/10]", 1997530776], + [1392, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 183246985], + [1408, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 3268438356], + [1414, 5, 1598, "Metrics/MethodLength: Method has too many lines. [46/10]", 849757258], + [1457, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1323237892], + [1463, 5, 1164, "Metrics/MethodLength: Method has too many lines. [36/10]", 1477831421], + [1496, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 931876829], + [1502, 5, 1699, "Metrics/MethodLength: Method has too many lines. [43/10]", 1125544678], + [1548, 5, 1016, "Metrics/MethodLength: Method has too many lines. [27/10]", 2194427985], + [1578, 5, 1058, "Metrics/MethodLength: Method has too many lines. [30/10]", 47860722], + [1611, 5, 1186, "Metrics/MethodLength: Method has too many lines. [31/10]", 676863486], + [1639, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 2689509078], + [1645, 5, 1517, "Metrics/MethodLength: Method has too many lines. [41/10]", 3855445172], + [1658, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 817380904], + [1683, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 409671963], + [1689, 5, 2116, "Metrics/MethodLength: Method has too many lines. [61/10]", 524104794], + [1753, 5, 820, "Metrics/MethodLength: Method has too many lines. [12/10]", 1888457180], + [1753, 37, 298, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [10/5]", 789483382], + [1754, 121, 100, "Layout/LineLength: Line is too long. [220/120]", 3288750271], + [1769, 5, 3595, "Metrics/AbcSize: Assignment Branch Condition size for `initial_profile_promotion_policy` is too high. [<9, 20, 0> 21.93/17]", 83685787], + [1769, 5, 3595, "Metrics/MethodLength: Method has too many lines. [77/10]", 83685787], + [1849, 5, 768, "Metrics/MethodLength: Method has too many lines. [17/10]", 314059802], + [1870, 5, 1493, "Metrics/AbcSize: Assignment Branch Condition size for `evaluate_profile_selection_requirement` is too high. [<7, 23, 9> 25.67/17]", 3177555163], + [1870, 5, 1493, "Metrics/MethodLength: Method has too many lines. [29/10]", 3177555163], + [1871, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 2145168012], + [1878, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 683002336], + [1912, 5, 985, "Metrics/AbcSize: Assignment Branch Condition size for `profile_promotion_blocking_reasons` is too high. [<4, 25, 13> 28.46/17]", 1146627465], + [1912, 5, 985, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `profile_promotion_blocking_reasons` is too high. [10/7]", 1146627465], + [1912, 5, 985, "Metrics/MethodLength: Method has too many lines. [18/10]", 1146627465], + [1912, 5, 985, "Metrics/PerceivedComplexity: Perceived complexity for `profile_promotion_blocking_reasons` is too high. [10/8]", 1146627465], + [1933, 5, 3173, "Metrics/AbcSize: Assignment Branch Condition size for `validate_language_backend_profile` is too high. [<25, 68, 20> 75.16/17]", 2100389324], + [1933, 5, 3173, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `validate_language_backend_profile` is too high. [21/7]", 2100389324], + [1933, 5, 3173, "Metrics/MethodLength: Method has too many lines. [60/10]", 2100389324], + [1933, 5, 3173, "Metrics/PerceivedComplexity: Perceived complexity for `validate_language_backend_profile` is too high. [23/8]", 2100389324], + [2005, 5, 1523, "Metrics/AbcSize: Assignment Branch Condition size for `validate_backend_inventory` is too high. [<13, 38, 13> 42.21/17]", 1899037537], + [2005, 5, 1523, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `validate_backend_inventory` is too high. [13/7]", 1899037537], + [2005, 5, 1523, "Metrics/MethodLength: Method has too many lines. [25/10]", 1899037537], + [2005, 5, 1523, "Metrics/PerceivedComplexity: Perceived complexity for `validate_backend_inventory` is too high. [13/8]", 1899037537], + [2048, 5, 906, "Metrics/MethodLength: Method has too many lines. [20/10]", 3137959843], + [2071, 5, 2744, "Metrics/AbcSize: Assignment Branch Condition size for `detect_raw_merge_inconsistencies` is too high. [<8, 43, 21> 48.52/17]", 3717440692], + [2071, 5, 2744, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `detect_raw_merge_inconsistencies` is too high. [17/7]", 3717440692], + [2071, 5, 2744, "Metrics/MethodLength: Method has too many lines. [53/10]", 3717440692], + [2071, 5, 2744, "Metrics/PerceivedComplexity: Perceived complexity for `detect_raw_merge_inconsistencies` is too high. [17/8]", 3717440692], + [2086, 7, 1894, "Metrics/BlockLength: Block has too many lines. [33/25]", 758887611], + [2132, 5, 762, "Metrics/MethodLength: Method has too many lines. [11/10]", 3021402342], + [2146, 5, 490, "Metrics/MethodLength: Method has too many lines. [11/10]", 578473475], + [2160, 5, 881, "Metrics/AbcSize: Assignment Branch Condition size for `execute_independent_commutative_insertions` is too high. [<6, 16, 7> 18.47/17]", 259417386], + [2160, 5, 881, "Metrics/MethodLength: Method has too many lines. [21/10]", 259417386], + [2187, 5, 1107, "Metrics/AbcSize: Assignment Branch Condition size for `execute_independent_keyed_member_edits` is too high. [<10, 31, 15> 35.86/17]", 4271501385], + [2187, 5, 1107, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `execute_independent_keyed_member_edits` is too high. [14/7]", 4271501385], + [2187, 5, 1107, "Metrics/MethodLength: Method has too many lines. [24/10]", 4271501385], + [2187, 5, 1107, "Metrics/PerceivedComplexity: Perceived complexity for `execute_independent_keyed_member_edits` is too high. [14/8]", 4271501385], + [2231, 5, 3149, "Metrics/AbcSize: Assignment Branch Condition size for `parse_compact_ruleset` is too high. [<16, 68, 24> 73.86/17]", 3149098803], + [2231, 5, 3149, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `parse_compact_ruleset` is too high. [22/7]", 3149098803], + [2231, 5, 3149, "Metrics/MethodLength: Method has too many lines. [67/10]", 3149098803], + [2231, 5, 3149, "Metrics/PerceivedComplexity: Perceived complexity for `parse_compact_ruleset` is too high. [23/8]", 3149098803], + [2237, 7, 2544, "Metrics/BlockLength: Block has too many lines. [50/25]", 2484860466], + [2264, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193420054], + [2310, 5, 2658, "Metrics/AbcSize: Assignment Branch Condition size for `compact_ruleset_feature_profile` is too high. [<11, 67, 38> 77.81/17]", 4022599673], + [2310, 5, 2658, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `compact_ruleset_feature_profile` is too high. [29/7]", 4022599673], + [2310, 5, 2658, "Metrics/MethodLength: Method has too many lines. [66/10]", 4022599673], + [2310, 5, 2658, "Metrics/PerceivedComplexity: Perceived complexity for `compact_ruleset_feature_profile` is too high. [16/8]", 4022599673], + [2328, 7, 2243, "Metrics/BlockLength: Block has too many lines. [47/25]", 965041772], + [2395, 5, 2733, "Metrics/AbcSize: Assignment Branch Condition size for `classify_template_target_path` is too high. [<4, 36, 23> 42.91/17]", 3661828596], + [2395, 5, 2733, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `classify_template_target_path` is too high. [21/7]", 3661828596], + [2395, 5, 2733, "Metrics/MethodLength: Method has too many lines. [39/10]", 3661828596], + [2395, 5, 2733, "Metrics/PerceivedComplexity: Perceived complexity for `classify_template_target_path` is too high. [17/8]", 3661828596], + [2427, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], + [2441, 5, 416, "Metrics/MethodLength: Method has too many lines. [12/10]", 1388641773], + [2484, 5, 388, "Metrics/MethodLength: Method has too many lines. [12/10]", 2360583514], + [2513, 5, 820, "Metrics/MethodLength: Method has too many lines. [13/10]", 354674808], + [2529, 5, 929, "Metrics/AbcSize: Assignment Branch Condition size for `enrich_template_plan_entries` is too high. [<9, 12, 10> 18.03/17]", 2666747528], + [2529, 5, 929, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `enrich_template_plan_entries` is too high. [9/7]", 2666747528], + [2529, 5, 929, "Metrics/MethodLength: Method has too many lines. [19/10]", 2666747528], + [2529, 5, 929, "Metrics/PerceivedComplexity: Perceived complexity for `enrich_template_plan_entries` is too high. [10/8]", 2666747528], + [2552, 5, 1245, "Metrics/AbcSize: Assignment Branch Condition size for `enrich_template_plan_entries_with_token_state` is too high. [<11, 23, 14> 29.09/17]", 1507113977], + [2552, 5, 1245, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `enrich_template_plan_entries_with_token_state` is too high. [13/7]", 1507113977], + [2552, 5, 1245, "Metrics/MethodLength: Method has too many lines. [19/10]", 1507113977], + [2552, 5, 1245, "Metrics/PerceivedComplexity: Perceived complexity for `enrich_template_plan_entries_with_token_state` is too high. [13/8]", 1507113977], + [2576, 5, 1353, "Metrics/AbcSize: Assignment Branch Condition size for `prepare_template_entries` is too high. [<6, 18, 11> 21.93/17]", 2774310942], + [2576, 5, 1353, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `prepare_template_entries` is too high. [11/7]", 2774310942], + [2576, 5, 1353, "Metrics/MethodLength: Method has too many lines. [24/10]", 2774310942], + [2576, 5, 1353, "Metrics/PerceivedComplexity: Perceived complexity for `prepare_template_entries` is too high. [12/8]", 2774310942], + [2606, 5, 1494, "Metrics/AbcSize: Assignment Branch Condition size for `plan_template_execution` is too high. [<8, 22, 17> 28.93/17]", 3876421385], + [2606, 5, 1494, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `plan_template_execution` is too high. [14/7]", 3876421385], + [2606, 5, 1494, "Metrics/MethodLength: Method has too many lines. [29/10]", 3876421385], + [2606, 5, 1494, "Metrics/PerceivedComplexity: Perceived complexity for `plan_template_execution` is too high. [15/8]", 3876421385], + [2607, 7, 1421, "Metrics/BlockLength: Block has too many lines. [27/25]", 2887810383], + [2640, 5, 822, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 2749235529], + [2640, 37, 220, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 447165880], + [2641, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 518382509], + [2655, 5, 2060, "Metrics/AbcSize: Assignment Branch Condition size for `preview_template_execution` is too high. [<11, 42, 26> 50.61/17]", 2270817206], + [2655, 5, 2060, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `preview_template_execution` is too high. [25/7]", 2270817206], + [2655, 5, 2060, "Metrics/MethodLength: Method has too many lines. [39/10]", 2270817206], + [2655, 5, 2060, "Metrics/PerceivedComplexity: Perceived complexity for `preview_template_execution` is too high. [23/8]", 2270817206], + [2665, 7, 1809, "Metrics/BlockLength: Block has too many lines. [28/25]", 310337564], + [2703, 5, 2513, "Metrics/AbcSize: Assignment Branch Condition size for `apply_template_execution` is too high. [<14, 50, 25> 57.63/17]", 177708331], + [2703, 5, 2513, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `apply_template_execution` is too high. [26/7]", 177708331], + [2703, 5, 2513, "Metrics/MethodLength: Method has too many lines. [50/10]", 177708331], + [2703, 5, 2513, "Metrics/PerceivedComplexity: Perceived complexity for `apply_template_execution` is too high. [23/8]", 177708331], + [2714, 7, 2239, "Metrics/BlockLength: Block has too many lines. [38/25]", 1651205014], + [2764, 5, 1696, "Metrics/AbcSize: Assignment Branch Condition size for `evaluate_template_tree_convergence` is too high. [<11, 29, 17> 35.37/17]", 2507998041], + [2764, 5, 1696, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `evaluate_template_tree_convergence` is too high. [17/7]", 2507998041], + [2764, 5, 1696, "Metrics/MethodLength: Method has too many lines. [35/10]", 2507998041], + [2764, 5, 1696, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 2507998041], + [2764, 5, 1696, "Metrics/PerceivedComplexity: Perceived complexity for `evaluate_template_tree_convergence` is too high. [17/8]", 2507998041], + [2764, 43, 198, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 4214374277], + [2765, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 2983874608], + [2807, 5, 688, "Metrics/MethodLength: Method has too many lines. [15/10]", 3064253784], + [2807, 5, 688, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 3064253784], + [2807, 36, 216, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 448029307], + [2808, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 3840139076], + [2851, 5, 664, "Metrics/MethodLength: Method has too many lines. [13/10]", 995637868], + [2851, 5, 664, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 995637868], + [2851, 53, 202, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 4227116196], + [2852, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 418683952], + [2869, 5, 649, "Metrics/MethodLength: Method has too many lines. [13/10]", 1831524792], + [2869, 5, 649, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 1831524792], + [2869, 54, 178, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 2962381850], + [2870, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 3690915627], + [2887, 5, 1280, "Metrics/AbcSize: Assignment Branch Condition size for `apply_template_tree_execution_to_directory` is too high. [<6, 16, 6> 18.11/17]", 305449363], + [2887, 5, 1280, "Metrics/MethodLength: Method has too many lines. [23/10]", 305449363], + [2887, 5, 1280, "Metrics/ParameterLists: Method has too many optional parameters. [5/3]", 305449363], + [2887, 51, 200, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 1352434212], + [2888, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 1139621482], + [2916, 5, 2199, "Metrics/AbcSize: Assignment Branch Condition size for `report_template_tree_run` is too high. [<15, 42, 31> 54.31/17]", 975627723], + [2916, 5, 2199, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `report_template_tree_run` is too high. [25/7]", 975627723], + [2916, 5, 2199, "Metrics/MethodLength: Method has too many lines. [38/10]", 975627723], + [2916, 5, 2199, "Metrics/PerceivedComplexity: Perceived complexity for `report_template_tree_run` is too high. [26/8]", 975627723], + [2960, 5, 1515, "Metrics/AbcSize: Assignment Branch Condition size for `report_template_directory_apply` is too high. [<13, 35, 21> 42.84/17]", 3710254295], + [2960, 5, 1515, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `report_template_directory_apply` is too high. [17/7]", 3710254295], + [2960, 5, 1515, "Metrics/MethodLength: Method has too many lines. [26/10]", 3710254295], + [2960, 5, 1515, "Metrics/PerceivedComplexity: Perceived complexity for `report_template_directory_apply` is too high. [17/8]", 3710254295], + [2975, 20, 1, "Style/DoubleNegation: Avoid the use of double negation (`!!`).", 177540], + [2992, 5, 1656, "Metrics/AbcSize: Assignment Branch Condition size for `report_template_directory_plan` is too high. [<11, 24, 25> 36.36/17]", 2946319293], + [2992, 5, 1656, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `report_template_directory_plan` is too high. [18/7]", 2946319293], + [2992, 5, 1656, "Metrics/MethodLength: Method has too many lines. [36/10]", 2946319293], + [2992, 5, 1656, "Metrics/PerceivedComplexity: Perceived complexity for `report_template_directory_plan` is too high. [16/8]", 2946319293], + [3064, 7, 9, "Style/MultilineBlockChain: Avoid multi-line chains of blocks.", 3648222389], + [3085, 5, 410, "Metrics/MethodLength: Method has too many lines. [12/10]", 248324428], + [3091, 7, 11, "Style/MultilineBlockChain: Avoid multi-line chains of blocks.", 848344986], + [3135, 5, 712, "Metrics/MethodLength: Method has too many lines. [12/10]", 2500743043], + [3135, 27, 178, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 873705194], + [3135, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3023611470], + [3161, 42, 167, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 2002181571], + [3174, 5, 1097, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `structured_edit_selection_profile` is too high. [8/7]", 1149325233], + [3174, 5, 1097, "Metrics/MethodLength: Method has too many lines. [14/10]", 1149325233], + [3174, 42, 311, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [11/5]", 3814063337], + [3175, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 198450264], + [3188, 34, 47, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 3204815976], + [3193, 5, 869, "Metrics/MethodLength: Method has too many lines. [11/10]", 83957392], + [3193, 41, 250, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 1486072775], + [3194, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 1967186495], + [3204, 36, 47, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 3204815976], + [3209, 5, 1156, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `structured_edit_match_profile` is too high. [10/7]", 4112674787], + [3209, 5, 1156, "Metrics/MethodLength: Method has too many lines. [15/10]", 4112674787], + [3209, 5, 1156, "Metrics/PerceivedComplexity: Perceived complexity for `structured_edit_match_profile` is too high. [10/8]", 4112674787], + [3209, 38, 321, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [12/5]", 823565876], + [3210, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5859667], + [3211, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3673982236], + [3229, 5, 933, "Metrics/MethodLength: Method has too many lines. [14/10]", 2099388915], + [3229, 37, 319, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [12/5]", 250907892], + [3230, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177545], + [3231, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 4154814685], + [3248, 5, 907, "Metrics/MethodLength: Method has too many lines. [12/10]", 2242846328], + [3248, 42, 275, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 246196330], + [3249, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 1439117336], + [3265, 5, 1057, "Metrics/MethodLength: Method has too many lines. [14/10]", 2891607970], + [3265, 44, 323, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [11/5]", 1386547750], + [3266, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 1676243675], + [3267, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 4154814685], + [3284, 5, 1375, "Metrics/AbcSize: Assignment Branch Condition size for `structured_edit_request` is too high. [<11, 25, 10> 29.09/17]", 4153786554], + [3284, 5, 1375, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `structured_edit_request` is too high. [11/7]", 4153786554], + [3284, 5, 1375, "Metrics/MethodLength: Method has too many lines. [16/10]", 4153786554], + [3284, 5, 1375, "Metrics/PerceivedComplexity: Perceived complexity for `structured_edit_request` is too high. [11/8]", 4153786554], + [3284, 32, 370, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [13/5]", 2381882467], + [3285, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177545], + [3306, 5, 728, "Metrics/MethodLength: Method has too many lines. [11/10]", 4026157473], + [3306, 31, 175, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 773121544], + [3338, 5, 597, "Metrics/MethodLength: Method has too many lines. [11/10]", 4143495860], + [3377, 5, 577, "Metrics/MethodLength: Method has too many lines. [11/10]", 4169131743], + [3392, 5, 1011, "Metrics/AbcSize: Assignment Branch Condition size for `structured_edit_execution_report` is too high. [<7, 16, 7> 18.81/17]", 876221899], + [3392, 5, 1011, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `structured_edit_execution_report` is too high. [8/7]", 876221899], + [3392, 5, 1011, "Metrics/MethodLength: Method has too many lines. [12/10]", 876221899], + [3392, 41, 245, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 2484440861], + [3393, 121, 55, "Layout/LineLength: Line is too long. [175/120]", 4036992717], + [3418, 55, 170, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 668161765], + [3441, 5, 819, "Metrics/MethodLength: Method has too many lines. [12/10]", 2287133436], + [3441, 56, 217, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 3198032135], + [3442, 121, 51, "Layout/LineLength: Line is too long. [171/120]", 3526181051], + [3475, 5, 663, "Metrics/MethodLength: Method has too many lines. [11/10]", 1853778635], + [3484, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2162352564], + [3516, 5, 663, "Metrics/MethodLength: Method has too many lines. [11/10]", 1132214891], + [3525, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2162352564], + [3547, 5, 678, "Metrics/MethodLength: Method has too many lines. [11/10]", 556747511], + [3556, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 1808630920], + [3578, 5, 708, "Metrics/MethodLength: Method has too many lines. [11/10]", 3590891170], + [3587, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1367166441], + [3610, 5, 678, "Metrics/MethodLength: Method has too many lines. [11/10]", 689748855], + [3619, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 1808630920], + [3641, 5, 708, "Metrics/MethodLength: Method has too many lines. [11/10]", 1478642210], + [3650, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1367166441], + [3674, 5, 663, "Metrics/MethodLength: Method has too many lines. [11/10]", 239506091], + [3683, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2162352564], + [3705, 5, 693, "Metrics/MethodLength: Method has too many lines. [11/10]", 3803476550], + [3714, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 926808928], + [3737, 5, 728, "Metrics/MethodLength: Method has too many lines. [11/10]", 748161230], + [3746, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 2807086497], + [3768, 5, 758, "Metrics/MethodLength: Method has too many lines. [11/10]", 3900524558], + [3777, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3463884836], + [3801, 5, 748, "Metrics/MethodLength: Method has too many lines. [11/10]", 2076716686], + [3810, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 609414023], + [3832, 5, 778, "Metrics/MethodLength: Method has too many lines. [11/10]", 867958318], + [3836, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193343749], + [3841, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 1202823007], + [3865, 5, 728, "Metrics/MethodLength: Method has too many lines. [11/10]", 2078323790], + [3874, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 2807086497], + [3896, 5, 758, "Metrics/MethodLength: Method has too many lines. [11/10]", 121025422], + [3905, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3463884836], + [3927, 5, 733, "Metrics/MethodLength: Method has too many lines. [11/10]", 1216456558], + [3936, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 145839927], + [3958, 5, 763, "Metrics/MethodLength: Method has too many lines. [11/10]", 2946525998], + [3967, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 275709226], + [3991, 5, 768, "Metrics/MethodLength: Method has too many lines. [11/10]", 3281402414], + [3995, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177656], + [4000, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 1427340581], + [4037, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3673982236], + [4094, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193417070], + [4105, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 2768444], + [4112, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3833204035], + [4120, 5, 863, "Metrics/MethodLength: Method has too many lines. [11/10]", 3731153486], + [4124, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 4054494590], + [4129, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 2084326338], + [4135, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 4201858364], + [4139, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861122], + [4143, 5, 873, "Metrics/MethodLength: Method has too many lines. [11/10]", 1866057614], + [4147, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 3893180930], + [4152, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 863421408], + [4158, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 3247130491], + [4162, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1171438608], + [4166, 5, 883, "Metrics/MethodLength: Method has too many lines. [11/10]", 2352924462], + [4166, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860841], + [4167, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861334], + [4170, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 465221046], + [4175, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 1922522532], + [4191, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 4067226670], + [4195, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2033573170], + [4199, 5, 893, "Metrics/MethodLength: Method has too many lines. [11/10]", 1633175534], + [4199, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087926422], + [4200, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087421565], + [4203, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 615151909], + [4208, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 884393597], + [4234, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 417844693], + [4238, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1233681340], + [4242, 5, 903, "Metrics/MethodLength: Method has too many lines. [11/10]", 3964877742], + [4242, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1165873471], + [4243, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1322899615], + [4246, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 3471008807], + [4251, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 627945471], + [4257, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 2960084092], + [4261, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 2148514258], + [4265, 5, 913, "Metrics/MethodLength: Method has too many lines. [11/10]", 385546958], + [4265, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2970472935], + [4266, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 3808956371], + [4269, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 3412499338], + [4274, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 3274208144], + [4280, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 4275923717], + [4288, 5, 848, "Metrics/MethodLength: Method has too many lines. [11/10]", 457851502], + [4292, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 413805135], + [4297, 121, 45, "Layout/LineLength: Line is too long. [165/120]", 951908917], + [4303, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 1859200227], + [4311, 5, 808, "Metrics/MethodLength: Method has too many lines. [11/10]", 884695726], + [4315, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 2011807620], + [4320, 121, 37, "Layout/LineLength: Line is too long. [157/120]", 384138219], + [4326, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1176320663], + [4334, 5, 798, "Metrics/MethodLength: Method has too many lines. [11/10]", 1422521838], + [4338, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3247420006], + [4343, 121, 35, "Layout/LineLength: Line is too long. [155/120]", 1408316702], + [4349, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 938465266], + [4357, 5, 803, "Metrics/MethodLength: Method has too many lines. [11/10]", 2370839950], + [4361, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 74128911], + [4366, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 1364659899], + [4372, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2059517661], + [4380, 5, 803, "Metrics/MethodLength: Method has too many lines. [11/10]", 3379336814], + [4384, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 74128911], + [4389, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 1364659899], + [4437, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 4281772560], + [4445, 5, 833, "Metrics/MethodLength: Method has too many lines. [11/10]", 3245498510], + [4449, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3542644754], + [4454, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 1916814773], + [4460, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 859690879], + [4468, 5, 833, "Metrics/MethodLength: Method has too many lines. [11/10]", 4138830126], + [4472, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3542644754], + [4477, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 1916814773], + [4483, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 3880141603], + [4491, 5, 828, "Metrics/MethodLength: Method has too many lines. [11/10]", 3621010990], + [4495, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3917260126], + [4500, 121, 41, "Layout/LineLength: Line is too long. [161/120]", 1879260859], + [4506, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 1776611011], + [4514, 5, 838, "Metrics/MethodLength: Method has too many lines. [11/10]", 514585454], + [4518, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1353518231], + [4523, 121, 43, "Layout/LineLength: Line is too long. [163/120]", 1228459824], + [4529, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 3932349968], + [4533, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087903307], + [4537, 5, 878, "Metrics/MethodLength: Method has too many lines. [11/10]", 1525737454], + [4537, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177548], + [4538, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177538], + [4541, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 2895681070], + [4546, 121, 51, "Layout/LineLength: Line is too long. [171/120]", 4040662298], + [4552, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 66929045], + [4560, 5, 808, "Metrics/MethodLength: Method has too many lines. [11/10]", 1626746606], + [4564, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 2011807620], + [4569, 121, 37, "Layout/LineLength: Line is too long. [157/120]", 384138219], + [4583, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 849230508], + [4591, 5, 838, "Metrics/MethodLength: Method has too many lines. [11/10]", 3531122670], + [4595, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1353518231], + [4600, 121, 43, "Layout/LineLength: Line is too long. [163/120]", 1228459824], + [4615, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1176320663], + [4623, 5, 798, "Metrics/MethodLength: Method has too many lines. [11/10]", 1118421486], + [4627, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3247420006], + [4632, 121, 35, "Layout/LineLength: Line is too long. [155/120]", 1408316702], + [4654, 5, 693, "Metrics/MethodLength: Method has too many lines. [11/10]", 1668406662], + [4663, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 926808928], + [4677, 5, 648, "Metrics/MethodLength: Method has too many lines. [11/10]", 3479836893], + [4686, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193343749], + [4708, 5, 678, "Metrics/MethodLength: Method has too many lines. [11/10]", 3147549879], + [4717, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 1808630920], + [4752, 5, 677, "Metrics/MethodLength: Method has too many lines. [11/10]", 1206941784], + [4761, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 3937819337], + [4784, 5, 672, "Metrics/MethodLength: Method has too many lines. [11/10]", 3634903061], + [4793, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2162352564], + [4815, 5, 683, "Metrics/MethodLength: Method has too many lines. [11/10]", 3417053461], + [4824, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 926808928], + [4848, 5, 668, "Metrics/MethodLength: Method has too many lines. [11/10]", 1540762726], + [4857, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 1808630920], + [4879, 5, 698, "Metrics/MethodLength: Method has too many lines. [11/10]", 2804825893], + [4888, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1367166441], + [4911, 5, 683, "Metrics/MethodLength: Method has too many lines. [11/10]", 3165010613], + [4920, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 926808928], + [4942, 5, 713, "Metrics/MethodLength: Method has too many lines. [11/10]", 2795628035], + [4951, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 497133415], + [4957, 5, 864, "Metrics/MethodLength: Method has too many lines. [12/10]", 1086224878], + [4957, 50, 268, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [9/5]", 4022739767], + [4958, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1607400384], + [4982, 5, 658, "Metrics/MethodLength: Method has too many lines. [11/10]", 3999796489], + [4991, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 102058825], + [5005, 59, 179, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 1569981428], + [5006, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 1515849732], + [5037, 5, 694, "Metrics/MethodLength: Method has too many lines. [11/10]", 3830236120], + [5046, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2250857971], + [5060, 5, 673, "Metrics/MethodLength: Method has too many lines. [11/10]", 2413908653], + [5069, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1225026887], + [5083, 5, 663, "Metrics/MethodLength: Method has too many lines. [11/10]", 3935895659], + [5092, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2162352564], + [5106, 5, 692, "Metrics/MethodLength: Method has too many lines. [11/10]", 3660669627], + [5115, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3558241761], + [5129, 5, 612, "Metrics/MethodLength: Method has too many lines. [11/10]", 100391811], + [5168, 5, 693, "Metrics/MethodLength: Method has too many lines. [11/10]", 3138587622], + [5177, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 926808928], + [5199, 5, 688, "Metrics/MethodLength: Method has too many lines. [11/10]", 2736088861], + [5208, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 1992103013], + [5231, 5, 678, "Metrics/MethodLength: Method has too many lines. [11/10]", 2275602867], + [5240, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 3598350322], + [5263, 5, 602, "Metrics/MethodLength: Method has too many lines. [11/10]", 3023166371], + [5278, 36, 181, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 1071580945], + [5291, 5, 787, "Metrics/AbcSize: Assignment Branch Condition size for `group_projected_child_review_cases` is too high. [<4, 17, 4> 17.92/17]", 3391527151], + [5291, 5, 787, "Metrics/MethodLength: Method has too many lines. [18/10]", 3391527151], + [5315, 5, 705, "Metrics/MethodLength: Method has too many lines. [13/10]", 2629923275], + [5342, 5, 547, "Metrics/MethodLength: Method has too many lines. [12/10]", 1911190850], + [5367, 5, 1516, "Metrics/AbcSize: Assignment Branch Condition size for `review_projected_child_groups` is too high. [<11, 21, 9> 25.36/17]", 3333110579], + [5367, 5, 1516, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `review_projected_child_groups` is too high. [8/7]", 3333110579], + [5367, 5, 1516, "Metrics/MethodLength: Method has too many lines. [39/10]", 3333110579], + [5367, 5, 1516, "Metrics/PerceivedComplexity: Perceived complexity for `review_projected_child_groups` is too high. [9/8]", 3333110579], + [5401, 7, 7, "Style/MultilineBlockChain: Avoid multi-line chains of blocks.", 4045560504], + [5413, 5, 562, "Metrics/MethodLength: Method has too many lines. [14/10]", 3083915102], + [5432, 5, 1898, "Metrics/AbcSize: Assignment Branch Condition size for `resolve_delegated_child_outputs` is too high. [<11, 21, 6> 24.45/17]", 2739722546], + [5432, 5, 1898, "Metrics/MethodLength: Method has too many lines. [49/10]", 2739722546], + [5487, 5, 942, "Metrics/AbcSize: Assignment Branch Condition size for `execute_nested_merge` is too high. [<3, 17, 6> 18.28/17]", 766157172], + [5487, 5, 942, "Metrics/MethodLength: Method has too many lines. [20/10]", 766157172], + [5487, 29, 144, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 1404367793], + [5514, 5, 652, "Metrics/MethodLength: Method has too many lines. [13/10]", 2105803856], + [5533, 38, 140, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 1682835820], + [5563, 5, 577, "Metrics/MethodLength: Method has too many lines. [12/10]", 2659610443], + [5632, 5, 569, "Metrics/MethodLength: Method has too many lines. [14/10]", 20616641], + [5660, 5, 772, "Metrics/AbcSize: Assignment Branch Condition size for `conformance_manifest_review_request_ids` is too high. [<7, 16, 8> 19.21/17]", 3577418475], + [5660, 5, 772, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `conformance_manifest_review_request_ids` is too high. [9/7]", 3577418475], + [5660, 5, 772, "Metrics/MethodLength: Method has too many lines. [14/10]", 3577418475], + [5660, 5, 772, "Metrics/PerceivedComplexity: Perceived complexity for `conformance_manifest_review_request_ids` is too high. [9/8]", 3577418475], + [5714, 5, 606, "Metrics/MethodLength: Method has too many lines. [11/10]", 2675086662], + [5729, 5, 562, "Metrics/MethodLength: Method has too many lines. [11/10]", 3811715870], + [5744, 5, 578, "Metrics/MethodLength: Method has too many lines. [11/10]", 1776197415], + [5759, 5, 1298, "Metrics/AbcSize: Assignment Branch Condition size for `resolve_conformance_family_context` is too high. [<7, 28, 9> 30.23/17]", 4265202259], + [5759, 5, 1298, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `resolve_conformance_family_context` is too high. [10/7]", 4265202259], + [5759, 5, 1298, "Metrics/MethodLength: Method has too many lines. [23/10]", 4265202259], + [5759, 5, 1298, "Metrics/PerceivedComplexity: Perceived complexity for `resolve_conformance_family_context` is too high. [10/8]", 4265202259], + [5788, 5, 1994, "Metrics/AbcSize: Assignment Branch Condition size for `review_conformance_family_context` is too high. [<12, 24, 10> 28.64/17]", 2834851944], + [5788, 5, 1994, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `review_conformance_family_context` is too high. [10/7]", 2834851944], + [5788, 5, 1994, "Metrics/MethodLength: Method has too many lines. [41/10]", 2834851944], + [5788, 5, 1994, "Metrics/PerceivedComplexity: Perceived complexity for `review_conformance_family_context` is too high. [11/8]", 2834851944], + [5811, 121, 33, "Layout/LineLength: Line is too long. [153/120]", 641612328], + [5848, 5, 1844, "Metrics/AbcSize: Assignment Branch Condition size for `select_conformance_case` is too high. [<2, 43, 14> 45.27/17]", 670673209], + [5848, 5, 1844, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `select_conformance_case` is too high. [14/7]", 670673209], + [5848, 5, 1844, "Metrics/MethodLength: Method has too many lines. [30/10]", 670673209], + [5848, 5, 1844, "Metrics/PerceivedComplexity: Perceived complexity for `select_conformance_case` is too high. [16/8]", 670673209], + [5853, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 2135503892], + [5855, 121, 41, "Layout/LineLength: Line is too long. [161/120]", 3932054828], + [5864, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 3169124957], + [5886, 5, 509, "Metrics/MethodLength: Method has too many lines. [11/10]", 3552283123], + [5975, 5, 4195, "Metrics/AbcSize: Assignment Branch Condition size for `review_conformance_manifest` is too high. [<37, 63, 16> 74.79/17]", 2166560528], + [5975, 5, 4195, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `review_conformance_manifest` is too high. [14/7]", 2166560528], + [5975, 5, 4195, "Metrics/MethodLength: Method has too many lines. [89/10]", 2166560528], + [5975, 5, 4195, "Metrics/PerceivedComplexity: Perceived complexity for `review_conformance_manifest` is too high. [17/8]", 2166560528], + [6040, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2746826653], + [6056, 121, 47, "Layout/LineLength: Line is too long. [167/120]", 3035993839], + [6078, 5, 676, "Metrics/MethodLength: Method has too many lines. [15/10]", 3048335475], + [6101, 5, 1054, "Metrics/AbcSize: Assignment Branch Condition size for `plan_conformance_suite` is too high. [<11, 18, 8> 22.56/17]", 1855254788], + [6101, 5, 1054, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `plan_conformance_suite` is too high. [8/7]", 1855254788], + [6101, 5, 1054, "Metrics/MethodLength: Method has too many lines. [25/10]", 1855254788], + [6101, 31, 84, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 172854173], + [6166, 5, 1274, "Metrics/AbcSize: Assignment Branch Condition size for `plan_named_conformance_suites_with_diagnostics` is too high. [<11, 21, 7> 24.72/17]", 3991300730], + [6166, 5, 1274, "Metrics/MethodLength: Method has too many lines. [27/10]", 3991300730], + [6193, 121, 47, "Layout/LineLength: Line is too long. [167/120]", 3035993839], + [6258, 5, 2071, "Metrics/AbcSize: Assignment Branch Condition size for `review_decision_for_family_context` is too high. [<7, 22, 16> 28.09/17]", 4245377184], + [6258, 5, 2071, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `review_decision_for_family_context` is too high. [12/7]", 4245377184], + [6258, 5, 2071, "Metrics/MethodLength: Method has too many lines. [46/10]", 4245377184], + [6258, 5, 2071, "Metrics/PerceivedComplexity: Perceived complexity for `review_decision_for_family_context` is too high. [12/8]", 4245377184], + [6263, 7, 1766, "Metrics/BlockLength: Block has too many lines. [40/25]", 65448241], + [6315, 5, 686, "Metrics/MethodLength: Method has too many lines. [13/10]", 4030291682] ], "lib/ast/merge/ast_node.rb:2037773320": [ [44, 5, 7086, "Metrics/ClassLength: Class has too many lines. [114/100]", 201314721], @@ -689,6 +703,33 @@ [99, 11, 553, "Metrics/AbcSize: Assignment Branch Condition size for `line_text_from` is too high. [<4, 20, 4> 20.78/17]", 2680273536], [99, 11, 553, "Metrics/MethodLength: Method has too many lines. [13/10]", 2680273536] ], + "lib/ast/merge/comment_layout_emission_support.rb:3192614990": [ + [12, 5, 14039, "Metrics/ModuleLength: Module has too many lines. [287/100]", 2115648988], + [18, 40, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [29, 40, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [88, 43, 149, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 1025246092], + [100, 7, 916, "Metrics/MethodLength: Method has too many lines. [11/10]", 3294772058], + [100, 57, 163, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 1661656204], + [122, 7, 730, "Metrics/MethodLength: Method has too many lines. [13/10]", 2493279555], + [139, 62, 6, "Lint/UnusedMethodArgument: Unused method argument - `owners`.", 1719502071], + [193, 7, 477, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `retained_owner_leading_gap_for` is too high. [8/7]", 974771614], + [193, 7, 477, "Metrics/PerceivedComplexity: Perceived complexity for `retained_owner_leading_gap_for` is too high. [9/8]", 974771614], + [194, 40, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [220, 23, 24, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 1487466207], + [243, 7, 1015, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `root_boundary_lines_for` is too high. [11/7]", 2612519600], + [243, 7, 1015, "Metrics/MethodLength: Method has too many lines. [13/10]", 2612519600], + [243, 7, 1015, "Metrics/PerceivedComplexity: Perceived complexity for `root_boundary_lines_for` is too high. [11/8]", 2612519600], + [247, 34, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [271, 7, 959, "Metrics/AbcSize: Assignment Branch Condition size for `owner_bound_root_boundary_lines_for` is too high. [<8, 22, 17> 28.93/17]", 238225688], + [271, 7, 959, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `owner_bound_root_boundary_lines_for` is too high. [16/7]", 238225688], + [271, 7, 959, "Metrics/MethodLength: Method has too many lines. [17/10]", 238225688], + [271, 7, 959, "Metrics/PerceivedComplexity: Perceived complexity for `owner_bound_root_boundary_lines_for` is too high. [15/8]", 238225688], + [307, 7, 912, "Metrics/AbcSize: Assignment Branch Condition size for `root_boundary_range` is too high. [<6, 22, 12> 25.77/17]", 2821370782], + [307, 7, 912, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `root_boundary_range` is too high. [11/7]", 2821370782], + [307, 7, 912, "Metrics/MethodLength: Method has too many lines. [21/10]", 2821370782], + [307, 7, 912, "Metrics/PerceivedComplexity: Perceived complexity for `root_boundary_range` is too high. [12/8]", 2821370782], + [350, 7, 401, "Metrics/MethodLength: Method has too many lines. [11/10]", 559624650] + ], "lib/ast/merge/composite_match_refiner.rb:1718969703": [ [58, 7, 668, "Metrics/MethodLength: Method has too many lines. [14/10]", 2649148714] ], @@ -754,8 +795,8 @@ [90, 9, 2162, "Metrics/BlockLength: Block has too many lines. [50/25]", 3403609416], [169, 7, 394, "Metrics/MethodLength: Method has too many lines. [11/10]", 2028641628] ], - "lib/ast/merge/emitter_base.rb:655463559": [ - [26, 5, 14449, "Metrics/ClassLength: Class has too many lines. [226/100]", 2015391034], + "lib/ast/merge/emitter_base.rb:4280054392": [ + [26, 5, 14922, "Metrics/ClassLength: Class has too many lines. [232/100]", 2015391034], [95, 7, 653, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_comment_region` is too high. [9/7]", 24580929], [95, 7, 653, "Metrics/MethodLength: Method has too many lines. [12/10]", 24580929], [95, 7, 653, "Metrics/PerceivedComplexity: Perceived complexity for `emit_comment_region` is too high. [9/8]", 24580929], @@ -776,17 +817,17 @@ [186, 33, 218, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 1552587384], [187, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 1763090185], [189, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1371312610], - [256, 31, 17, "Style/NumericPredicate: Use `@indent_level.positive?` instead of `@indent_level > 0`.", 1892475678], - [302, 56, 12, "Lint/UnusedMethodArgument: Unused method argument - `current_line`. You can also write as `inline_comment_region_target_column(*)` if you want the method to accept any arguments but don't care about them.", 2091263933], - [306, 42, 6, "Lint/UnusedMethodArgument: Unused method argument - `region`.", 2124512157], - [306, 51, 13, "Lint/UnusedMethodArgument: Unused method argument - `target_column`.", 3246375805], - [321, 7, 1141, "Metrics/AbcSize: Assignment Branch Condition size for `inline_comment_node_text` is too high. [<6, 29, 8> 30.68/17]", 2583471562], - [321, 7, 1141, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `inline_comment_node_text` is too high. [9/7]", 2583471562], - [321, 7, 1141, "Metrics/MethodLength: Method has too many lines. [22/10]", 2583471562], - [321, 7, 1141, "Metrics/PerceivedComplexity: Perceived complexity for `inline_comment_node_text` is too high. [9/8]", 2583471562], - [339, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861626], - [350, 7, 510, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_region_gap_lines` is too high. [8/7]", 1999747697], - [350, 7, 510, "Metrics/PerceivedComplexity: Perceived complexity for `emit_region_gap_lines` is too high. [9/8]", 1999747697] + [271, 31, 17, "Style/NumericPredicate: Use `@indent_level.positive?` instead of `@indent_level > 0`.", 1892475678], + [317, 56, 12, "Lint/UnusedMethodArgument: Unused method argument - `current_line`. You can also write as `inline_comment_region_target_column(*)` if you want the method to accept any arguments but don't care about them.", 2091263933], + [321, 42, 6, "Lint/UnusedMethodArgument: Unused method argument - `region`.", 2124512157], + [321, 51, 13, "Lint/UnusedMethodArgument: Unused method argument - `target_column`.", 3246375805], + [336, 7, 1141, "Metrics/AbcSize: Assignment Branch Condition size for `inline_comment_node_text` is too high. [<6, 29, 8> 30.68/17]", 2583471562], + [336, 7, 1141, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `inline_comment_node_text` is too high. [9/7]", 2583471562], + [336, 7, 1141, "Metrics/MethodLength: Method has too many lines. [22/10]", 2583471562], + [336, 7, 1141, "Metrics/PerceivedComplexity: Perceived complexity for `inline_comment_node_text` is too high. [9/8]", 2583471562], + [354, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861626], + [365, 7, 510, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_region_gap_lines` is too high. [8/7]", 1999747697], + [365, 7, 510, "Metrics/PerceivedComplexity: Perceived complexity for `emit_region_gap_lines` is too high. [9/8]", 1999747697] ], "lib/ast/merge/emitter_line_metadata_support.rb:3153033769": [ [5, 5, 33, "Style/Documentation: Missing top-level documentation comment for `module Ast::Merge::EmitterLineMetadataSupport`.", 2926748997], @@ -857,15 +898,15 @@ "lib/ast/merge/layout.rb:3670500101": [ [23, 36, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765] ], - "lib/ast/merge/layout/augmenter.rb:2556116722": [ - [8, 7, 5498, "Metrics/ClassLength: Class has too many lines. [129/100]", 3693754698], - [21, 23, 125, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 3395039982], - [53, 9, 1795, "Metrics/AbcSize: Assignment Branch Condition size for `build!` is too high. [<20, 32, 17> 41.39/17]", 3542913254], - [53, 9, 1795, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `build!` is too high. [15/7]", 3542913254], - [53, 9, 1795, "Metrics/MethodLength: Method has too many lines. [43/10]", 3542913254], - [53, 9, 1795, "Metrics/PerceivedComplexity: Perceived complexity for `build!` is too high. [15/8]", 3542913254], - [58, 11, 1227, "Metrics/BlockLength: Block has too many lines. [29/25]", 55360131], - [105, 9, 504, "Metrics/MethodLength: Method has too many lines. [16/10]", 1953725517] + "lib/ast/merge/layout/augmenter.rb:3229088287": [ + [8, 7, 5440, "Metrics/ClassLength: Class has too many lines. [128/100]", 2306720287], + [23, 23, 125, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 3395039982], + [55, 9, 1795, "Metrics/AbcSize: Assignment Branch Condition size for `build!` is too high. [<20, 32, 17> 41.39/17]", 3542913254], + [55, 9, 1795, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `build!` is too high. [15/7]", 3542913254], + [55, 9, 1795, "Metrics/MethodLength: Method has too many lines. [43/10]", 3542913254], + [55, 9, 1795, "Metrics/PerceivedComplexity: Perceived complexity for `build!` is too high. [15/8]", 3542913254], + [60, 11, 1227, "Metrics/BlockLength: Block has too many lines. [29/25]", 55360131], + [107, 9, 504, "Metrics/MethodLength: Method has too many lines. [16/10]", 1953725517] ], "lib/ast/merge/layout/gap.rb:1678106201": [ [11, 7, 7558, "Metrics/ClassLength: Class has too many lines. [151/100]", 2254377349], @@ -876,29 +917,35 @@ [203, 9, 688, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `validate_adjacency!` is too high. [10/7]", 1112786311], [203, 9, 688, "Metrics/MethodLength: Method has too many lines. [13/10]", 1112786311] ], + "lib/ast/merge/line_range_support.rb:773479830": [ + [13, 7, 430, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `object_start_line` is too high. [8/7]", 2485070052], + [13, 7, 430, "Metrics/PerceivedComplexity: Perceived complexity for `object_start_line` is too high. [9/8]", 2485070052], + [25, 7, 414, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `object_end_line` is too high. [8/7]", 3545256164], + [25, 7, 414, "Metrics/PerceivedComplexity: Perceived complexity for `object_end_line` is too high. [9/8]", 3545256164] + ], "lib/ast/merge/match_refiner_base.rb:1760054866": [ [248, 7, 503, "Metrics/MethodLength: Method has too many lines. [11/10]", 2844230268], [275, 7, 1056, "Metrics/AbcSize: Assignment Branch Condition size for `greedy_match` is too high. [<9, 24, 8> 26.85/17]", 2497617815], [275, 7, 1056, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `greedy_match` is too high. [8/7]", 2497617815], [275, 7, 1056, "Metrics/MethodLength: Method has too many lines. [24/10]", 2497617815] ], - "lib/ast/merge/merge_result_base.rb:764500297": [ - [17, 5, 18646, "Metrics/ClassLength: Class has too many lines. [335/100]", 314460772], + "lib/ast/merge/merge_result_base.rb:1342312150": [ + [17, 5, 19111, "Metrics/ClassLength: Class has too many lines. [341/100]", 1211564896], [88, 21, 187, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 1067369198], - [187, 7, 843, "Metrics/AbcSize: Assignment Branch Condition size for `normalize_blank_line_runs!` is too high. [<12, 12, 10> 19.7/17]", 2347011594], - [187, 7, 843, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `normalize_blank_line_runs!` is too high. [9/7]", 2347011594], - [187, 7, 843, "Metrics/MethodLength: Method has too many lines. [22/10]", 2347011594], - [187, 7, 843, "Metrics/PerceivedComplexity: Perceived complexity for `normalize_blank_line_runs!` is too high. [10/8]", 2347011594], - [227, 7, 1004, "Metrics/MethodLength: Method has too many lines. [21/10]", 59539336], - [227, 35, 211, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 709487711], - [266, 7, 602, "Metrics/MethodLength: Method has too many lines. [13/10]", 320027623], - [341, 7, 927, "Metrics/AbcSize: Assignment Branch Condition size for `validate_review_state_compatibility!` is too high. [<8, 15, 4> 17.46/17]", 1596840080], - [341, 7, 927, "Metrics/MethodLength: Method has too many lines. [16/10]", 1596840080], - [403, 7, 936, "Metrics/AbcSize: Assignment Branch Condition size for `review_state_metadata` is too high. [<7, 18, 4> 19.72/17]", 4128292066], - [403, 7, 936, "Metrics/MethodLength: Method has too many lines. [14/10]", 4128292066], - [413, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 20421901], - [438, 7, 1194, "Metrics/MethodLength: Method has too many lines. [21/10]", 4289697646], - [448, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 3342583337] + [202, 7, 843, "Metrics/AbcSize: Assignment Branch Condition size for `normalize_blank_line_runs!` is too high. [<12, 12, 10> 19.7/17]", 2347011594], + [202, 7, 843, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `normalize_blank_line_runs!` is too high. [9/7]", 2347011594], + [202, 7, 843, "Metrics/MethodLength: Method has too many lines. [22/10]", 2347011594], + [202, 7, 843, "Metrics/PerceivedComplexity: Perceived complexity for `normalize_blank_line_runs!` is too high. [10/8]", 2347011594], + [242, 7, 1004, "Metrics/MethodLength: Method has too many lines. [21/10]", 59539336], + [242, 35, 211, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [8/5]", 709487711], + [281, 7, 602, "Metrics/MethodLength: Method has too many lines. [13/10]", 320027623], + [356, 7, 927, "Metrics/AbcSize: Assignment Branch Condition size for `validate_review_state_compatibility!` is too high. [<8, 15, 4> 17.46/17]", 1596840080], + [356, 7, 927, "Metrics/MethodLength: Method has too many lines. [16/10]", 1596840080], + [418, 7, 936, "Metrics/AbcSize: Assignment Branch Condition size for `review_state_metadata` is too high. [<7, 18, 4> 19.72/17]", 4128292066], + [418, 7, 936, "Metrics/MethodLength: Method has too many lines. [14/10]", 4128292066], + [428, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 20421901], + [453, 7, 1194, "Metrics/MethodLength: Method has too many lines. [21/10]", 4289697646], + [463, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 3342583337] ], "lib/ast/merge/merger_config.rb:3582657829": [ [46, 5, 10581, "Metrics/ClassLength: Class has too many lines. [148/100]", 1598770872], @@ -1059,8 +1106,9 @@ [200, 9, 765, "Metrics/AbcSize: Assignment Branch Condition size for `register_known_gems` is too high. [<3, 17, 3> 17.52/17]", 1367620151], [200, 9, 765, "Metrics/MethodLength: Method has too many lines. [17/10]", 1367620151] ], - "lib/ast/merge/rspec/shared_examples.rb:2878318351": [ - [29, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 330577472] + "lib/ast/merge/rspec/shared_examples.rb:151517887": [ + [27, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193426019], + [31, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 330577472] ], "lib/ast/merge/rspec/shared_examples/comment_behavior_matrix.rb:3695671858": [ [36, 1, 27847, "Metrics/BlockLength: Block has too many lines. [540/25]", 3796645407], @@ -1135,6 +1183,9 @@ "lib/ast/merge/rspec/shared_examples/reproducible_partial_merge.rb:524436129": [ [3, 1, 2321, "Metrics/BlockLength: Block has too many lines. [44/25]", 3206099540] ], + "lib/ast/merge/rspec/shared_examples/retained_blank_gap_compliance.rb:2798862618": [ + [3, 1, 1409, "Metrics/BlockLength: Block has too many lines. [34/25]", 3708955218] + ], "lib/ast/merge/rspec/shared_examples/runtime_debug_contract.rb:4244040583": [ [8, 1, 2808, "Metrics/BlockLength: Block has too many lines. [48/25]", 3274492878] ], @@ -1249,7 +1300,7 @@ [245, 9, 1446, "Metrics/MethodLength: Method has too many lines. [28/10]", 525095633], [245, 9, 1446, "Metrics/PerceivedComplexity: Perceived complexity for `merge_sections` is too high. [13/8]", 525095633] ], - "lib/ast/merge/smart_merger_base.rb:4189972287": [ + "lib/ast/merge/smart_merger_base.rb:1823596106": [ [109, 5, 15324, "Metrics/ClassLength: Class has too many lines. [172/100]", 3547407870], [214, 7, 1974, "Metrics/AbcSize: Assignment Branch Condition size for `initialize` is too high. [<20, 14, 5> 24.92/17]", 2211610736], [214, 7, 1974, "Metrics/MethodLength: Method has too many lines. [23/10]", 2211610736], @@ -1260,15 +1311,37 @@ [424, 7, 1312, "Metrics/PerceivedComplexity: Perceived complexity for `parse_and_analyze` is too high. [10/8]", 1640248187], [517, 12, 52, "Style/NumericPredicate: Use `result_class.instance_method(:initialize).arity.zero?` instead of `result_class.instance_method(:initialize).arity == 0`.", 1312375552] ], + "lib/ast/merge/source_region_report_support.rb:31261288": [ + [10, 5, 9026, "Metrics/ModuleLength: Module has too many lines. [204/100]", 3211817308], + [13, 7, 1175, "Metrics/MethodLength: Method has too many lines. [19/10]", 351011969], + [13, 49, 232, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 1034046028], + [38, 7, 1409, "Metrics/AbcSize: Assignment Branch Condition size for `source_blank_line_ownership_regions` is too high. [<9, 23, 11> 27.04/17]", 280304508], + [38, 7, 1409, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `source_blank_line_ownership_regions` is too high. [9/7]", 280304508], + [38, 7, 1409, "Metrics/MethodLength: Method has too many lines. [26/10]", 280304508], + [38, 7, 1409, "Metrics/PerceivedComplexity: Perceived complexity for `source_blank_line_ownership_regions` is too high. [11/8]", 280304508], + [69, 7, 1345, "Metrics/AbcSize: Assignment Branch Condition size for `source_interleaved_regions_for_report` is too high. [<10, 13, 6> 17.46/17]", 253205841], + [69, 7, 1345, "Metrics/MethodLength: Method has too many lines. [32/10]", 253205841], + [109, 7, 1638, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `source_interstitial_region_for_report` is too high. [11/7]", 2543419072], + [109, 7, 1638, "Metrics/MethodLength: Method has too many lines. [32/10]", 2543419072], + [109, 7, 1638, "Metrics/PerceivedComplexity: Perceived complexity for `source_interstitial_region_for_report` is too high. [10/8]", 2543419072], + [109, 48, 133, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 2244283058], + [168, 7, 455, "Metrics/MethodLength: Method has too many lines. [12/10]", 1734550115], + [184, 7, 1444, "Metrics/AbcSize: Assignment Branch Condition size for `source_comment_block_attachment` is too high. [<7, 27, 17> 32.66/17]", 2744031837], + [184, 7, 1444, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `source_comment_block_attachment` is too high. [14/7]", 2744031837], + [184, 7, 1444, "Metrics/MethodLength: Method has too many lines. [21/10]", 2744031837], + [184, 7, 1444, "Metrics/PerceivedComplexity: Perceived complexity for `source_comment_block_attachment` is too high. [15/8]", 2744031837], + [184, 42, 133, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 2758724348], + [192, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177625] + ], "lib/ast/merge/structural_edit/boundary.rb:2838060197": [ [20, 23, 93, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 3901214537], [41, 38, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], [51, 38, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], [60, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087440865] ], - "lib/ast/merge/structural_edit/boundary_support.rb:2036464761": [ - [31, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861061], - [32, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 97596930] + "lib/ast/merge/structural_edit/boundary_support.rb:3537000977": [ + [32, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861061], + [33, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 97596930] ], "lib/ast/merge/structural_edit/plan_set.rb:538463647": [ [116, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 2855200692] @@ -1434,6 +1507,19 @@ [4, 3, 3101, "Metrics/BlockLength: Block has too many lines. [63/25]", 1050939978], [81, 3, 1313, "Metrics/BlockLength: Block has too many lines. [30/25]", 515655104] ], + "spec/ast/merge/comment_layout_emission_support_spec.rb:19704158": [ + [3, 1, 7555, "Metrics/BlockLength: Block has too many lines. [186/25]", 980479163], + [4, 3, 73, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 3470206647], + [6, 3, 175, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 622428252], + [16, 3, 93, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 546547334], + [18, 3, 734, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 3226190975], + [21, 19, 120, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 3763716348], + [39, 27, 6, "Lint/UnusedMethodArgument: Unused method argument - `owners`. You can also write as `comment_augmenter(*)` if you want the method to accept any arguments but don't care about them.", 1719502071], + [44, 3, 574, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 1736750341], + [61, 3, 152, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 1212551629], + [101, 3, 1173, "Metrics/BlockLength: Block has too many lines. [27/25]", 2346194513], + [132, 3, 1624, "Metrics/BlockLength: Block has too many lines. [36/25]", 2359972174] + ], "spec/ast/merge/comment_spec.rb:81945459": [ [3, 1, 15888, "Metrics/BlockLength: Block has too many lines. [384/25]", 2229554982], [4, 3, 3957, "Metrics/BlockLength: Block has too many lines. [84/25]", 660667217], @@ -1532,14 +1618,14 @@ [47, 5, 1938, "Metrics/BlockLength: Block has too many lines. [48/25]", 1904497583], [191, 3, 1488, "Metrics/BlockLength: Block has too many lines. [43/25]", 1632956840] ], - "spec/ast/merge/emitter_base_spec.rb:4197360291": [ - [3, 1, 11215, "Metrics/BlockLength: Block has too many lines. [282/25]", 4254840781], - [30, 3, 4393, "Metrics/BlockLength: Block has too many lines. [102/25]", 3992142376], - [134, 58, 12, "Lint/UnusedMethodArgument: Unused method argument - `current_line`. You can also write as `inline_comment_region_target_column(*)` if you want the method to accept any arguments but don't care about them.", 2091263933], - [138, 44, 6, "Lint/UnusedMethodArgument: Unused method argument - `region`.", 2124512157], - [159, 3, 1815, "Metrics/BlockLength: Block has too many lines. [39/25]", 719023387], - [206, 3, 2233, "Metrics/BlockLength: Block has too many lines. [62/25]", 3754339775], - [312, 3, 1059, "Metrics/BlockLength: Block has too many lines. [26/25]", 375007123] + "spec/ast/merge/emitter_base_spec.rb:1099876333": [ + [3, 1, 11967, "Metrics/BlockLength: Block has too many lines. [301/25]", 2970792295], + [56, 3, 4393, "Metrics/BlockLength: Block has too many lines. [102/25]", 3992142376], + [160, 58, 12, "Lint/UnusedMethodArgument: Unused method argument - `current_line`. You can also write as `inline_comment_region_target_column(*)` if you want the method to accept any arguments but don't care about them.", 2091263933], + [164, 44, 6, "Lint/UnusedMethodArgument: Unused method argument - `region`.", 2124512157], + [185, 3, 1815, "Metrics/BlockLength: Block has too many lines. [39/25]", 719023387], + [232, 3, 2233, "Metrics/BlockLength: Block has too many lines. [62/25]", 3754339775], + [338, 3, 1059, "Metrics/BlockLength: Block has too many lines. [26/25]", 375007123] ], "spec/ast/merge/fictive_language_harness_spec.rb:1179155480": [ [6, 1, 6693, "Metrics/BlockLength: Block has too many lines. [143/25]", 245088433], @@ -1602,6 +1688,12 @@ [3, 1, 2758, "Metrics/BlockLength: Block has too many lines. [72/25]", 2052697931], [9, 3, 1290, "Metrics/BlockLength: Block has too many lines. [28/25]", 3175967312] ], + "spec/ast/merge/line_range_support_spec.rb:872979873": [ + [3, 1, 1564, "Metrics/BlockLength: Block has too many lines. [35/25]", 1133178812], + [4, 3, 65, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 2231059390], + [5, 3, 44, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 1230426940], + [7, 3, 135, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 1825860348] + ], "spec/ast/merge/match_refiner_base_spec.rb:3961767223": [ [3, 1, 10604, "Metrics/BlockLength: Block has too many lines. [301/25]", 4290485382], [4, 3, 1146, "Metrics/BlockLength: Block has too many lines. [37/25]", 108051658], @@ -1628,15 +1720,15 @@ [417, 3, 1792, "Metrics/BlockLength: Block has too many lines. [45/25]", 3557977606], [438, 5, 1121, "Metrics/BlockLength: Block has too many lines. [26/25]", 4236927298] ], - "spec/ast/merge/merge_result_base_spec.rb:2262708492": [ - [3, 1, 19471, "Metrics/BlockLength: Block has too many lines. [529/25]", 4106058751], + "spec/ast/merge/merge_result_base_spec.rb:3826389024": [ + [3, 1, 20371, "Metrics/BlockLength: Block has too many lines. [552/25]", 3965341976], [38, 3, 2735, "Metrics/BlockLength: Block has too many lines. [80/25]", 1103243845], - [279, 3, 1611, "Metrics/BlockLength: Block has too many lines. [39/25]", 1928511417], - [280, 5, 1203, "Metrics/BlockLength: Block has too many lines. [26/25]", 857223227], - [326, 3, 2070, "Metrics/BlockLength: Block has too many lines. [48/25]", 2552826824], - [385, 3, 5769, "Metrics/BlockLength: Block has too many lines. [140/25]", 1457747735], - [511, 5, 1306, "Metrics/BlockLength: Block has too many lines. [29/25]", 2980786372], - [574, 3, 1308, "Metrics/BlockLength: Block has too many lines. [32/25]", 1342704008] + [312, 3, 1611, "Metrics/BlockLength: Block has too many lines. [39/25]", 1928511417], + [313, 5, 1203, "Metrics/BlockLength: Block has too many lines. [26/25]", 857223227], + [359, 3, 2070, "Metrics/BlockLength: Block has too many lines. [48/25]", 2552826824], + [418, 3, 5769, "Metrics/BlockLength: Block has too many lines. [140/25]", 1457747735], + [544, 5, 1306, "Metrics/BlockLength: Block has too many lines. [29/25]", 2980786372], + [607, 3, 1308, "Metrics/BlockLength: Block has too many lines. [32/25]", 1342704008] ], "spec/ast/merge/merger_config_spec.rb:663896662": [ [5, 1, 7314, "Metrics/BlockLength: Block has too many lines. [189/25]", 1279589310], @@ -1782,6 +1874,9 @@ "spec/ast/merge/rspec/shared_examples/reproducible_partial_merge_spec.rb:2862326360": [ [19, 3, 600, "Metrics/MethodLength: Method has too many lines. [13/10]", 1542875905] ], + "spec/ast/merge/rspec/tree_haver_backend_contract_spec.rb:3942689234": [ + [20, 1, 1737, "Metrics/BlockLength: Block has too many lines. [29/25]", 2339568528] + ], "spec/ast/merge/ruleset/config_spec.rb:1860949041": [ [3, 1, 9431, "Metrics/BlockLength: Block has too many lines. [236/25]", 4015119559], [24, 3, 5341, "Metrics/BlockLength: Block has too many lines. [149/25]", 2361087446], @@ -1847,6 +1942,14 @@ [416, 5, 1026, "Metrics/BlockLength: Block has too many lines. [33/25]", 1993879652], [461, 3, 1031, "Metrics/BlockLength: Block has too many lines. [31/25]", 35315996] ], + "spec/ast/merge/source_region_report_support_spec.rb:3996528026": [ + [3, 1, 5448, "Metrics/BlockLength: Block has too many lines. [186/25]", 2713581049], + [4, 3, 112, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 3709101366], + [6, 3, 295, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 1625952400], + [17, 3, 1473, "Metrics/BlockLength: Block has too many lines. [49/25]", 1435042916], + [70, 3, 1887, "Metrics/BlockLength: Block has too many lines. [66/25]", 1773930426], + [159, 3, 1109, "Metrics/BlockLength: Block has too many lines. [38/25]", 1457507554] + ], "spec/ast/merge/structural_edit/boundary_support_spec.rb:863387845": [ [3, 1, 4226, "Metrics/BlockLength: Block has too many lines. [86/25]", 1889771490], [16, 9, 42, "Lint/HashCompareByIdentity: Use `Hash#compare_by_identity` instead of using `object_id` for keys.", 1304492024], @@ -1977,775 +2080,775 @@ [70, 3, 78, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 604224776], [72, 3, 146, "Lint/ConstantDefinitionInBlock: Do not define constants this way within a block.", 3315091322] ], - "spec/fixtures_integration_spec.rb:1145500459": [ + "spec/fixtures_integration_spec.rb:1733315771": [ [595, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5859109], [758, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 576909008], [881, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087900170], - [1806, 3, 816, "Metrics/MethodLength: Method has too many lines. [13/10]", 170960660], - [1806, 39, 213, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [10/5]", 635200700], - [1807, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3976306097], - [1831, 38, 80, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 3297939075], - [1916, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1745553512], - [1917, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 118067488], - [1918, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 196190368], - [1919, 121, 41, "Layout/LineLength: Line is too long. [161/120]", 3371256193], - [2090, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 3241114703], - [2428, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177548], - [2567, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177548], - [2991, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3697593604], - [2992, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177548], - [3113, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 179435314], - [3122, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 1182194285], - [3124, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 3886107031], - [3151, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1751849111], - [3152, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1519587684], - [3153, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 4086262880], - [3170, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3568081822], - [3171, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1776876782], - [3173, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], - [3174, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1751849111], - [3176, 121, 73, "Layout/LineLength: Line is too long. [193/120]", 3322243646], - [3178, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1715153206], - [3179, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], - [3180, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 504997180], - [3181, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 1146860021], - [3182, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 2312101607], - [3183, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 1423779161], - [3184, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1900897138], - [3185, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 1689840383], - [3186, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 1589056236], - [3188, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 763176550], - [3194, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 3957871310], - [3196, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 763176550], - [3198, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 919916608], - [3199, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 919916608], - [3200, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 3957871310], - [3201, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 4073040612], - [3202, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 763176550], - [3203, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 667593075], - [3205, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1310972770], - [3206, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 311387795], - [3207, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 724840266], - [3208, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 2555878310], - [3209, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1781078972], - [3210, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], - [3213, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], - [3214, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1658060570], - [3215, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 3085728851], - [3216, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 3129400559], - [3217, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3197516464], - [3218, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087771520], - [3219, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 3837194228], - [3220, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 1312323543], - [3221, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 2356847623], - [3222, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], - [3223, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 3428073441], - [3224, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 2891080552], - [3225, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 3080737172], - [3226, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 170445026], - [3227, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3240051869], - [3228, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 4266052680], - [3229, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 3376297786], - [3230, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 398435913], - [3231, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 4134940256], - [3232, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 30370035], - [3233, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 2862546359], - [3234, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1901388514], - [3235, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 838864274], - [3236, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 3437460384], - [3237, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 1567003152], - [3238, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2609066305], - [3239, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 4043187090], - [3240, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3866430009], - [3241, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 2182699083], - [3242, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 3958792129], - [3243, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 3449926560], - [3244, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 399774089], - [3245, 121, 68, "Layout/LineLength: Line is too long. [188/120]", 2119246799], - [3247, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3592658842], - [3248, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 2905723409], - [3249, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 3930305198], - [3250, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 4186230052], - [3251, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], - [3252, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2700200720], - [3253, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 1630526402], - [3254, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 3669244926], - [3255, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 2814234644], - [3256, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 3109415933], - [3257, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 3643275044], - [3258, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 3825290660], - [3259, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1751849111], - [3260, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 4112285398], - [3261, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 1684279672], - [3262, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 1616506266], - [3264, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], - [3265, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1330093223], - [3266, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 4084555566], - [3267, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 2466867154], - [3268, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 4088314613], - [3269, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 2416893689], - [3270, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 683312682], - [3271, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 2516517934], - [3272, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2414563355], - [3273, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 2232595211], - [3274, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 2940789369], - [3275, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 941259913], - [3276, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2133508098], - [3277, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 1621975014], - [3278, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 35985461], - [3279, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 746016305], - [3280, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 435488100], - [3281, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 2581129172], - [3282, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 3495900774], - [3283, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 1413120342], - [3284, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], - [3285, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2333800791], - [3286, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 2576906206], - [3287, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 2986659874], - [3288, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2811932564], - [3289, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 1970813291], - [3290, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 2904941246], - [3291, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 3745922508], - [3292, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 735247237], - [3293, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 3731320885], - [3294, 121, 70, "Layout/LineLength: Line is too long. [190/120]", 3896022034], - [3295, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 2827048584], - [3296, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 2548596663], - [3297, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 3812352018], - [3298, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 1280243910], - [3299, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 1742643292], - [3300, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 3056442430], - [3301, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 3144363287], - [3302, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 477297993], - [3303, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 3657857971], - [3304, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3913984414], - [3305, 121, 70, "Layout/LineLength: Line is too long. [190/120]", 336201058], - [3306, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 485418789], - [3307, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 453253839], - [3308, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3673833034], - [3309, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 1552836890], - [3310, 121, 70, "Layout/LineLength: Line is too long. [190/120]", 2714635965], - [3311, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 9336999], - [3312, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 584857208], - [3313, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 1394865213], - [3314, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 3973222761], - [3315, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 2020040051], - [3316, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 3060994335], - [3317, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 196286917], - [3318, 121, 72, "Layout/LineLength: Line is too long. [192/120]", 4168514178], - [3319, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 810581246], - [3320, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 1473417372], - [3321, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 3008376885], - [3322, 121, 84, "Layout/LineLength: Line is too long. [204/120]", 454816400], - [3323, 121, 88, "Layout/LineLength: Line is too long. [208/120]", 1416223705], - [3324, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 2896813919], - [3325, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 957293983], - [3326, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 2118117430], - [3327, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 1367404612], - [3328, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 2459902188], - [3329, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 461483815], - [3330, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 2791596520], - [3331, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 203085787], - [3332, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 2942095139], - [3333, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 131861965], - [3334, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 3340827551], - [3335, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 102582610], - [3336, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 762789354], - [3337, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 3478337442], - [3338, 121, 112, "Layout/LineLength: Line is too long. [232/120]", 4010607435], - [3339, 121, 132, "Layout/LineLength: Line is too long. [252/120]", 3754747587], - [3340, 121, 136, "Layout/LineLength: Line is too long. [256/120]", 379336923], - [3341, 121, 108, "Layout/LineLength: Line is too long. [228/120]", 3366353902], - [3342, 121, 128, "Layout/LineLength: Line is too long. [248/120]", 1686898289], - [3343, 121, 132, "Layout/LineLength: Line is too long. [252/120]", 2005192241], - [3344, 121, 104, "Layout/LineLength: Line is too long. [224/120]", 1868634464], - [3345, 121, 124, "Layout/LineLength: Line is too long. [244/120]", 3939743614], - [3346, 121, 128, "Layout/LineLength: Line is too long. [248/120]", 2978506702], - [3347, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 3909866928], - [3348, 121, 118, "Layout/LineLength: Line is too long. [238/120]", 2853032177], - [3349, 121, 122, "Layout/LineLength: Line is too long. [242/120]", 2968366309], - [3350, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 1753663643], - [3351, 121, 102, "Layout/LineLength: Line is too long. [222/120]", 3387619436], - [3352, 121, 106, "Layout/LineLength: Line is too long. [226/120]", 197895496], - [3353, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 576181861], - [3354, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 2809313444], - [3355, 121, 102, "Layout/LineLength: Line is too long. [222/120]", 3963067112], - [3356, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 1121380327], - [3357, 121, 100, "Layout/LineLength: Line is too long. [220/120]", 31591211], - [3358, 121, 104, "Layout/LineLength: Line is too long. [224/120]", 1946129497], - [3359, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 767185096], - [3360, 121, 100, "Layout/LineLength: Line is too long. [220/120]", 1092646020], - [3361, 121, 104, "Layout/LineLength: Line is too long. [224/120]", 1328841270], - [3362, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 2663749624], - [3363, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 430318647], - [3364, 121, 72, "Layout/LineLength: Line is too long. [192/120]", 1650234037], - [3365, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 1082269805], - [3366, 121, 92, "Layout/LineLength: Line is too long. [212/120]", 316397809], - [3367, 121, 92, "Layout/LineLength: Line is too long. [212/120]", 3145391348], - [3368, 121, 112, "Layout/LineLength: Line is too long. [232/120]", 2808088654], - [3369, 121, 116, "Layout/LineLength: Line is too long. [236/120]", 1035513748], - [3370, 121, 92, "Layout/LineLength: Line is too long. [212/120]", 2552800539], - [3371, 121, 112, "Layout/LineLength: Line is too long. [232/120]", 1727699169], - [3372, 121, 116, "Layout/LineLength: Line is too long. [236/120]", 1171566267], - [3373, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 2994775049], - [3374, 121, 110, "Layout/LineLength: Line is too long. [230/120]", 3860489151], - [3375, 121, 114, "Layout/LineLength: Line is too long. [234/120]", 959496607], - [3376, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 1694222439], - [3377, 121, 114, "Layout/LineLength: Line is too long. [234/120]", 1501186331], - [3378, 121, 118, "Layout/LineLength: Line is too long. [238/120]", 4059659418], - [3379, 121, 110, "Layout/LineLength: Line is too long. [230/120]", 1899868779], - [3380, 121, 130, "Layout/LineLength: Line is too long. [250/120]", 323324279], - [3381, 121, 134, "Layout/LineLength: Line is too long. [254/120]", 3956414359], - [3382, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 3506644741], - [3383, 121, 116, "Layout/LineLength: Line is too long. [236/120]", 936139074], - [3384, 121, 136, "Layout/LineLength: Line is too long. [256/120]", 4153213512], - [3385, 121, 140, "Layout/LineLength: Line is too long. [260/120]", 1491976338], - [3386, 121, 102, "Layout/LineLength: Line is too long. [222/120]", 4061753206], - [3387, 121, 106, "Layout/LineLength: Line is too long. [226/120]", 2410434304], - [3388, 121, 124, "Layout/LineLength: Line is too long. [244/120]", 3518300264], - [3389, 121, 144, "Layout/LineLength: Line is too long. [264/120]", 1040696046], - [3390, 121, 148, "Layout/LineLength: Line is too long. [268/120]", 139604188], - [3391, 121, 120, "Layout/LineLength: Line is too long. [240/120]", 231937793], - [3392, 121, 140, "Layout/LineLength: Line is too long. [260/120]", 1835509805], - [3393, 121, 144, "Layout/LineLength: Line is too long. [264/120]", 1629218396], - [3394, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 2312875700], - [3395, 121, 102, "Layout/LineLength: Line is too long. [222/120]", 2933374083], - [3396, 121, 106, "Layout/LineLength: Line is too long. [226/120]", 1719349671], - [3397, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 2555579810], - [3398, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 2023551624], - [3399, 121, 114, "Layout/LineLength: Line is too long. [234/120]", 955231924], - [3400, 121, 118, "Layout/LineLength: Line is too long. [238/120]", 4232993781], - [3401, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 3472954835], - [3402, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 3211922285], - [3403, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 2874956332], - [3404, 121, 102, "Layout/LineLength: Line is too long. [222/120]", 1360335840], - [3405, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2135379556], - [3406, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3242768475], - [3407, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 2789115918], - [3408, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 3346448124], - [3409, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1538469817], - [3410, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 1543041113], - [3411, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 3344741438], - [3412, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2188404009], - [3413, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 1330398779], - [3414, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 332468826], - [3415, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 1905397598], - [3416, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 438831062], - [3417, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 3377667334], - [3418, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3232541734], - [3420, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2130930429], - [3421, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 3684939371], - [3423, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2361951097], - [3424, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 1211447462], - [3425, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3309872691], - [3426, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 360053761], - [3427, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 1310136493], - [3428, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 1950686342], - [3429, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 1397845826], - [3430, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 4191304724], - [3431, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2354128498], - [3432, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 1865717453], - [3433, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 24220542], - [3434, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 2618612673], - [3437, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 3422918867], - [3438, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 3689431739], - [3482, 121, 47, "Layout/LineLength: Line is too long. [167/120]", 4093564799], - [3488, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1662653970], - [3489, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 3967501655], - [3490, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2178516622], - [3491, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 1345346561], - [3505, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193466072], - [3625, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 3612393276], - [3626, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 797303985], - [3629, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1606320605], - [3649, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1776876782], - [3653, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 828742791], - [3673, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 3294617581], - [3683, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 3519842846], - [3693, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1966440909], - [3694, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 830053864], - [3700, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1606320605], - [3723, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 1340744311], - [3742, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1741893077], - [3743, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 830053865], - [3747, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193405204], - [3761, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1401226501], - [3764, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2085352569], - [3767, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 696523922], - [3782, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 182097675], - [3792, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2746826653], - [4208, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 1138870161], - [4770, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], - [4781, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 2132299307], - [4828, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087775098], - [4839, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 757851079], - [4875, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], - [4886, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 441649198], - [4909, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087903295], - [4921, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 170442008], - [4930, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2102137893], - [4932, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 1888875443], - [4969, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 398433651], - [4980, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3921367744], - [5003, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2422819473], - [5009, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 194583095], - [5015, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1901385496], - [5024, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 490810486], - [5026, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 586287746], - [5030, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1310969752], - [5050, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087389205], - [5062, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2609063547], - [5071, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2102137893], - [5073, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 1370761696], - [5096, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 2208661169], - [5102, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1862604658], - [5108, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 3958789371], - [5117, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 3449594464], - [5119, 121, 37, "Layout/LineLength: Line is too long. [157/120]", 692050524], - [5123, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 802172558], - [5193, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 2406691660], - [5228, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], - [5239, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 1811982742], - [5266, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2562189319], - [5272, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193430346], - [5278, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 2814237166], - [5287, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2189106693], - [5289, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 3874870868], - [5293, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 179474914], - [5326, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1751845165], - [5337, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2617230371], - [5341, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], - [5382, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], - [5393, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3793790598], - [5428, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 4088312783], - [5439, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3220724736], - [5443, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087899888], - [5462, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2552888401], - [5468, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 194583095], - [5474, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2414559905], - [5483, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 626762179], - [5485, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 3969284923], - [5489, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 1893261414], - [5521, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2133507320], - [5532, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 2101353476], - [5536, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087685705], - [5555, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2431380437], - [5561, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 194583095], - [5567, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 435489438], - [5576, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 1520878209], - [5578, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 2238995076], - [5582, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 2789405913], - [5615, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], - [5626, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3409328196], - [5649, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087858069], - [5661, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2811935086], - [5670, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2102137893], - [5672, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 1113346693], - [5676, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3227128786], - [5696, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 48793812], - [5702, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 338440584], - [5708, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 735248703], - [5717, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 927473097], - [5719, 121, 43, "Layout/LineLength: Line is too long. [163/120]", 1394536741], - [5723, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 3134012967], - [5742, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 2967615316], - [5748, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 2810710931], - [5754, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 2548594701], - [5757, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860796], - [5759, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 182097675], - [5763, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 3549194295], - [5765, 121, 55, "Layout/LineLength: Line is too long. [175/120]", 1074004741], - [5769, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 2874423564], - [5772, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087576526], - [5774, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 182097675], - [5789, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 1696848307], - [5795, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 2883501659], - [5801, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 3056443076], - [5806, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193405204], - [5810, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 1487412605], - [5812, 121, 51, "Layout/LineLength: Line is too long. [171/120]", 2021571284], - [5816, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 1975782995], - [5819, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860796], - [5821, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193405204], - [5826, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 183236849], - [5835, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 856018753], - [5838, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], - [5841, 121, 37, "Layout/LineLength: Line is too long. [157/120]", 2146546324], - [5847, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3913983076], - [5850, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 3491931666], - [5852, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 3536323546], - [5856, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 356581191], - [5858, 121, 63, "Layout/LineLength: Line is too long. [183/120]", 4144657639], - [5862, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 1478616653], - [5865, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1774852021], - [5867, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 3536323546], - [5882, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 3884289787], - [5888, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 1001503687], - [5894, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3673836976], - [5903, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 3164908550], - [5905, 121, 43, "Layout/LineLength: Line is too long. [163/120]", 1134300778], - [5909, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 1797165224], - [5928, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 2508143995], - [5934, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 3002532188], - [5940, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 584857986], - [5943, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860796], - [5945, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 182097675], - [5949, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 749691384], - [5951, 121, 55, "Layout/LineLength: Line is too long. [175/120]", 3389354954], - [5955, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 3402045699], - [5958, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087576526], - [5960, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 182097675], - [5974, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 2447716612], - [5980, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3201685099], - [5986, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 3060990885], - [5995, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 29396315], - [5997, 121, 45, "Layout/LineLength: Line is too long. [165/120]", 1228645365], - [6001, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1436742837], - [6020, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 716917214], - [6026, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 2175814211], - [6032, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 1473420390], - [6035, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193433391], - [6037, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1422839111], - [6041, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 1571170198], - [6043, 121, 57, "Layout/LineLength: Line is too long. [177/120]", 2175059093], - [6047, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3886666417], - [6050, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 176753677], - [6052, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1422839111], - [6068, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 3471319495], - [6074, 121, 33, "Layout/LineLength: Line is too long. [153/120]", 1274038477], - [6080, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 2896814693], - [6083, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087576526], - [6085, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 4114086530], - [6089, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 250433828], - [6091, 121, 59, "Layout/LineLength: Line is too long. [179/120]", 3910556848], - [6095, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 4002014976], - [6098, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 3491931666], - [6100, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 4114086530], - [6194, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861664], - [6208, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087932582], - [6222, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861664], - [6238, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 876012844], - [6240, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1756764194], - [6241, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 4173216735], - [6244, 121, 75, "Layout/LineLength: Line is too long. [195/120]", 911964425], - [6245, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 173266907], - [6246, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1412705933], - [6249, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1756764194], - [6250, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 2605683750], - [6253, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 3182252139], - [6255, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 1652557742], - [6259, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 2240437058], - [6260, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 173266907], - [6261, 121, 101, "Layout/LineLength: Line is too long. [221/120]", 3694598076], - [6263, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861152], - [6264, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 179079542], - [6265, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 3528944411], - [6268, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3020159378], - [6270, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 1652557742], - [6276, 121, 84, "Layout/LineLength: Line is too long. [204/120]", 420843234], - [6278, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1401226501], - [6279, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 442915368], - [6282, 121, 79, "Layout/LineLength: Line is too long. [199/120]", 4212444955], - [6283, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 830053864], - [6284, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 1373660924], - [6287, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1401226501], - [6288, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 1539225758], - [6291, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3020159378], - [6293, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 4240691845], - [6297, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 674553335], - [6298, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 830053864], - [6299, 121, 105, "Layout/LineLength: Line is too long. [225/120]", 4163432287], - [6301, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2089555761], - [6302, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 2034687276], - [6303, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 3710905302], - [6306, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 4204667212], - [6308, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 4240691845], - [6314, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 2071493433], - [6316, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2085352569], - [6317, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 2853066942], - [6320, 121, 71, "Layout/LineLength: Line is too long. [191/120]", 2771467828], - [6321, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193425976], - [6322, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 3025157142], - [6325, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2085352569], - [6326, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 3340824101], - [6329, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 3999804761], - [6331, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 1999310973], - [6335, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 835016333], - [6336, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193425976], - [6337, 121, 97, "Layout/LineLength: Line is too long. [217/120]", 3575893945], - [6340, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193405945], - [6341, 121, 72, "Layout/LineLength: Line is too long. [192/120]", 1755858308], - [6344, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 3182252139], - [6346, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 1999310973], - [6352, 121, 70, "Layout/LineLength: Line is too long. [190/120]", 3033080032], - [6354, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177549], - [6355, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 2720985203], - [6358, 121, 65, "Layout/LineLength: Line is too long. [185/120]", 3233424320], - [6360, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1165873483], - [6363, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177549], - [6364, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 131859703], - [6367, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1943494546], - [6369, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 4016166830], - [6373, 121, 72, "Layout/LineLength: Line is too long. [192/120]", 1350760977], - [6375, 121, 91, "Layout/LineLength: Line is too long. [211/120]", 4098706554], - [6379, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 4059724765], - [6382, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 1651955548], - [6384, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 4016166830], - [6390, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 1057495720], - [6393, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1621971220], - [6396, 121, 49, "Layout/LineLength: Line is too long. [169/120]", 1585717593], - [6402, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 2942094233], - [6405, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2624667704], - [6407, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 2317051977], - [6411, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 1321610634], - [6413, 121, 75, "Layout/LineLength: Line is too long. [195/120]", 2854688831], - [6417, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 4185465554], - [6420, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1169781875], - [6422, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 2317051977], - [6428, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 1916545020], - [6431, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1422839111], - [6434, 121, 45, "Layout/LineLength: Line is too long. [165/120]", 910134593], - [6440, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 203086561], - [6443, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2939363812], - [6445, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3155638331], - [6449, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 1955758062], - [6451, 121, 71, "Layout/LineLength: Line is too long. [191/120]", 3737424359], - [6455, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 3597620692], - [6458, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2624667704], - [6460, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3155638331], - [6466, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 1036052399], - [6469, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 4114086530], - [6472, 121, 47, "Layout/LineLength: Line is too long. [167/120]", 1268266488], - [6478, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 2791598354], - [6481, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1302589368], - [6483, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3533902728], - [6487, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 3942276897], - [6489, 121, 73, "Layout/LineLength: Line is too long. [193/120]", 1175941460], - [6493, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 679697318], - [6496, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 28126263], - [6498, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3533902728], - [6499, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 181895237], - [6504, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 4057848448], - [6507, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 4114086530], - [6510, 121, 47, "Layout/LineLength: Line is too long. [167/120]", 4067769399], - [6516, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 461482909], - [6519, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1302589368], - [6521, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3533902728], - [6525, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 3561204590], - [6527, 121, 73, "Layout/LineLength: Line is too long. [193/120]", 880160795], - [6531, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 1614719145], - [6534, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 28126263], - [6536, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3533902728], - [6537, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 181895237], - [6584, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193432306], - [6598, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 1645945966], - [6601, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3212740609], - [6604, 121, 59, "Layout/LineLength: Line is too long. [179/120]", 3982698123], - [6606, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193425997], - [6610, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 2663750402], - [6613, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2420297272], - [6615, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1164389943], - [6619, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 3483121581], - [6621, 121, 85, "Layout/LineLength: Line is too long. [205/120]", 2271668600], - [6625, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 804794365], - [6628, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3659367004], - [6630, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1164389943], - [6631, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 561395486], - [6636, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 1251661057], - [6639, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3212740609], - [6642, 121, 59, "Layout/LineLength: Line is too long. [179/120]", 3210109508], - [6644, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193425997], - [6648, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 430316685], - [6651, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2420297272], - [6653, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1164389943], - [6657, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 2428160226], - [6659, 121, 85, "Layout/LineLength: Line is too long. [205/120]", 2663295671], - [6663, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 2822109938], - [6666, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3659367004], - [6668, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1164389943], - [6669, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 561395486], - [6674, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 857639785], - [6677, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 3669622788], - [6680, 121, 57, "Layout/LineLength: Line is too long. [177/120]", 140453799], - [6682, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860765], - [6686, 121, 72, "Layout/LineLength: Line is too long. [192/120]", 1650236431], - [6689, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 150699323], - [6691, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 50618962], - [6695, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 4205571164], - [6697, 121, 83, "Layout/LineLength: Line is too long. [203/120]", 1549528021], - [6701, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 1325488145], - [6704, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 1510711065], - [6706, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 50618962], - [6712, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 3043205563], - [6715, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2381137493], - [6718, 121, 61, "Layout/LineLength: Line is too long. [181/120]", 2200345195], - [6720, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087926498], - [6724, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 1082269527], - [6727, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 1510711065], - [6729, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 1104064739], - [6733, 121, 68, "Layout/LineLength: Line is too long. [188/120]", 1652941658], - [6735, 121, 87, "Layout/LineLength: Line is too long. [207/120]", 1440323819], - [6739, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 802896260], - [6742, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1943494546], - [6744, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 1104064739], - [6750, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 788730815], - [6752, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 2034687276], - [6753, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 4226330106], - [6756, 121, 77, "Layout/LineLength: Line is too long. [197/120]", 2414796320], - [6757, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1165873470], - [6758, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 3090817832], - [6761, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 2034687276], - [6762, 121, 92, "Layout/LineLength: Line is too long. [212/120]", 2839148677], - [6765, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 2393983240], - [6767, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 2581936864], - [6771, 121, 84, "Layout/LineLength: Line is too long. [204/120]", 3923254945], - [6772, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1165873470], - [6773, 121, 103, "Layout/LineLength: Line is too long. [223/120]", 580639726], - [6775, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193419246], - [6776, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1756764194], - [6777, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 3202758044], - [6780, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 912651721], - [6782, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 2581936864], - [6786, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1164293389], - [6799, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860840], - [6800, 121, 88, "Layout/LineLength: Line is too long. [208/120]", 574552570], - [6802, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3845073641], - [6803, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 543375177], - [6806, 121, 83, "Layout/LineLength: Line is too long. [203/120]", 222410330], - [6807, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 3025157219], - [6808, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1904561434], - [6811, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 489872984], - [6812, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 97325617], - [6815, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 4204667212], - [6817, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 4062673070], - [6821, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 1451915960], - [6822, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 3025157219], - [6823, 121, 109, "Layout/LineLength: Line is too long. [229/120]", 4200529758], - [6825, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1497831350], - [6826, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 4214367244], - [6827, 121, 84, "Layout/LineLength: Line is too long. [204/120]", 399603517], - [6830, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 3423548875], - [6832, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 4062673070], - [6836, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 3279830097], - [6848, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 659167322], - [6860, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087926423], - [6861, 121, 57, "Layout/LineLength: Line is too long. [177/120]", 3300294193], - [6863, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 3172850966], - [6864, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 2396187736], - [6867, 121, 87, "Layout/LineLength: Line is too long. [207/120]", 1991888901], - [6868, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1954380402], - [6869, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2589970962], - [6872, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 42340644], - [6873, 121, 67, "Layout/LineLength: Line is too long. [187/120]", 479235996], - [6876, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 3423548875], - [6878, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 1462541970], - [6882, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 1373978781], - [6883, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1954380402], - [6884, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 280641011], - [6886, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1664110553], - [6887, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1009650381], - [6888, 121, 88, "Layout/LineLength: Line is too long. [208/120]", 909329343], - [6891, 121, 33, "Layout/LineLength: Line is too long. [153/120]", 2977589831], - [6893, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 1462541970], - [6898, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1165873470], - [6899, 121, 61, "Layout/LineLength: Line is too long. [181/120]", 1904101094], - [6901, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2229256255], - [6902, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 1839090017], - [6905, 121, 91, "Layout/LineLength: Line is too long. [211/120]", 4260980907], - [6906, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 4253118453], - [6907, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 1536690221], - [6909, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861152], - [6910, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 209824656], - [6911, 121, 71, "Layout/LineLength: Line is too long. [191/120]", 1530496074], - [6914, 121, 33, "Layout/LineLength: Line is too long. [153/120]", 2977589831], - [6916, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 3261436902], - [6920, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 3762694917], - [6921, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 4253118453], - [6922, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 3196230010], - [6924, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3165598659], - [6925, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 4264469493], - [6926, 121, 92, "Layout/LineLength: Line is too long. [212/120]", 3140690958], - [6929, 121, 35, "Layout/LineLength: Line is too long. [155/120]", 2999583208], - [6931, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 3261436902], - [6937, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 326070599], - [6940, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1621971220], - [6943, 121, 49, "Layout/LineLength: Line is too long. [169/120]", 1689000214], - [6949, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 2459904022], - [6952, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2624667704], - [6954, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 2317051977], - [6958, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 2842872837], - [6960, 121, 75, "Layout/LineLength: Line is too long. [195/120]", 423884656], - [6964, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 2673769885], - [6967, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1169781875], - [6969, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 2317051977], - [6970, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2126253911], - [6986, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 2388292564], - [6989, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2381137493], - [6992, 121, 61, "Layout/LineLength: Line is too long. [181/120]", 1136762660], - [6994, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087926498], - [6998, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 2555581016], - [7001, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 1510711065], - [7003, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 1104064739], - [7007, 121, 68, "Layout/LineLength: Line is too long. [188/120]", 1986812885], - [7009, 121, 87, "Layout/LineLength: Line is too long. [207/120]", 1864036132], - [7013, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 3590180043], - [7016, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1943494546], - [7018, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 1104064739], - [7019, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2382712010], - [7029, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1791534645], - [7034, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 2403815412], - [7037, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1422839111], - [7040, 121, 45, "Layout/LineLength: Line is too long. [165/120]", 4046048864], - [7046, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 3472955113], - [7049, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2939363812], - [7051, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3155638331], - [7055, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3911469720], - [7057, 121, 71, "Layout/LineLength: Line is too long. [191/120]", 272433263], - [7061, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 634420444], - [7064, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2624667704], - [7066, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3155638331], - [7067, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2088324682], - [7080, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087906711], - [7092, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2135380894], - [7101, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2102137893], - [7103, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 4280757685], - [7107, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 161599970], - [7141, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 830053789], - [7176, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2188407955], - [7187, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3692322233], - [7191, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087557694], - [7214, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3197512522], - [7223, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858840], - [7225, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 85298067], - [7282, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193418403], - [7288, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193418403], - [7311, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087432474], - [7323, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2361949763], - [7332, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2102137893], - [7334, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 581045160], - [7338, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 4235011647], - [7357, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1898147766], - [7363, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177560], - [7369, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 1310140439], - [7378, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 681770239], - [7380, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3821940657], - [7384, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], - [7404, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861292], - [7416, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2354124424], - [7425, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087922021], - [7427, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 3921370162], - [8020, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 4083054536], - [8048, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 4083054536], - [8077, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 4083054536], - [8135, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 632953222], - [8164, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 732995265], - [8214, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 1886249927], - [8376, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 578751979], - [8377, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 3803540269], - [8386, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2238403955], - [8387, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 1028441932], - [8388, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 1975950909], - [8443, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1244043798] + [1810, 3, 816, "Metrics/MethodLength: Method has too many lines. [13/10]", 170960660], + [1810, 39, 213, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [10/5]", 635200700], + [1811, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3976306097], + [1835, 38, 80, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 3297939075], + [1920, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1745553512], + [1921, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 118067488], + [1922, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 196190368], + [1923, 121, 41, "Layout/LineLength: Line is too long. [161/120]", 3371256193], + [2094, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 3241114703], + [2432, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177548], + [2571, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177548], + [2995, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3697593604], + [2996, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177548], + [3117, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 179435314], + [3126, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 1182194285], + [3128, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 3886107031], + [3155, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1751849111], + [3156, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1519587684], + [3157, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 4086262880], + [3174, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3568081822], + [3175, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1776876782], + [3177, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], + [3178, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1751849111], + [3180, 121, 73, "Layout/LineLength: Line is too long. [193/120]", 3322243646], + [3182, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1715153206], + [3183, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], + [3184, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 504997180], + [3185, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 1146860021], + [3186, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 2312101607], + [3187, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 1423779161], + [3188, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1900897138], + [3189, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 1689840383], + [3190, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 1589056236], + [3192, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 763176550], + [3198, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 3957871310], + [3200, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 763176550], + [3202, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 919916608], + [3203, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 919916608], + [3204, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 3957871310], + [3205, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 4073040612], + [3206, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 763176550], + [3207, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 667593075], + [3209, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1310972770], + [3210, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 311387795], + [3211, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 724840266], + [3212, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 2555878310], + [3213, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1781078972], + [3214, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], + [3217, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], + [3218, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1658060570], + [3219, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 3085728851], + [3220, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 3129400559], + [3221, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3197516464], + [3222, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087771520], + [3223, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 3837194228], + [3224, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 1312323543], + [3225, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 2356847623], + [3226, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], + [3227, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 3428073441], + [3228, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 2891080552], + [3229, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 3080737172], + [3230, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 170445026], + [3231, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3240051869], + [3232, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 4266052680], + [3233, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 3376297786], + [3234, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 398435913], + [3235, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 4134940256], + [3236, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 30370035], + [3237, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 2862546359], + [3238, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1901388514], + [3239, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 838864274], + [3240, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 3437460384], + [3241, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 1567003152], + [3242, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2609066305], + [3243, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 4043187090], + [3244, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3866430009], + [3245, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 2182699083], + [3246, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 3958792129], + [3247, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 3449926560], + [3248, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 399774089], + [3249, 121, 68, "Layout/LineLength: Line is too long. [188/120]", 2119246799], + [3251, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3592658842], + [3252, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 2905723409], + [3253, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 3930305198], + [3254, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 4186230052], + [3255, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], + [3256, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2700200720], + [3257, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 1630526402], + [3258, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 3669244926], + [3259, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 2814234644], + [3260, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 3109415933], + [3261, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 3643275044], + [3262, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 3825290660], + [3263, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1751849111], + [3264, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 4112285398], + [3265, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 1684279672], + [3266, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 1616506266], + [3268, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], + [3269, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1330093223], + [3270, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 4084555566], + [3271, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 2466867154], + [3272, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 4088314613], + [3273, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 2416893689], + [3274, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 683312682], + [3275, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 2516517934], + [3276, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2414563355], + [3277, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 2232595211], + [3278, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 2940789369], + [3279, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 941259913], + [3280, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2133508098], + [3281, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 1621975014], + [3282, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 35985461], + [3283, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 746016305], + [3284, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 435488100], + [3285, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 2581129172], + [3286, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 3495900774], + [3287, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 1413120342], + [3288, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858795], + [3289, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2333800791], + [3290, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 2576906206], + [3291, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 2986659874], + [3292, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2811932564], + [3293, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 1970813291], + [3294, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 2904941246], + [3295, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 3745922508], + [3296, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 735247237], + [3297, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 3731320885], + [3298, 121, 70, "Layout/LineLength: Line is too long. [190/120]", 3896022034], + [3299, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 2827048584], + [3300, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 2548596663], + [3301, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 3812352018], + [3302, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 1280243910], + [3303, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 1742643292], + [3304, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 3056442430], + [3305, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 3144363287], + [3306, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 477297993], + [3307, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 3657857971], + [3308, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3913984414], + [3309, 121, 70, "Layout/LineLength: Line is too long. [190/120]", 336201058], + [3310, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 485418789], + [3311, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 453253839], + [3312, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3673833034], + [3313, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 1552836890], + [3314, 121, 70, "Layout/LineLength: Line is too long. [190/120]", 2714635965], + [3315, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 9336999], + [3316, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 584857208], + [3317, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 1394865213], + [3318, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 3973222761], + [3319, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 2020040051], + [3320, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 3060994335], + [3321, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 196286917], + [3322, 121, 72, "Layout/LineLength: Line is too long. [192/120]", 4168514178], + [3323, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 810581246], + [3324, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 1473417372], + [3325, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 3008376885], + [3326, 121, 84, "Layout/LineLength: Line is too long. [204/120]", 454816400], + [3327, 121, 88, "Layout/LineLength: Line is too long. [208/120]", 1416223705], + [3328, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 2896813919], + [3329, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 957293983], + [3330, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 2118117430], + [3331, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 1367404612], + [3332, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 2459902188], + [3333, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 461483815], + [3334, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 2791596520], + [3335, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 203085787], + [3336, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 2942095139], + [3337, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 131861965], + [3338, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 3340827551], + [3339, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 102582610], + [3340, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 762789354], + [3341, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 3478337442], + [3342, 121, 112, "Layout/LineLength: Line is too long. [232/120]", 4010607435], + [3343, 121, 132, "Layout/LineLength: Line is too long. [252/120]", 3754747587], + [3344, 121, 136, "Layout/LineLength: Line is too long. [256/120]", 379336923], + [3345, 121, 108, "Layout/LineLength: Line is too long. [228/120]", 3366353902], + [3346, 121, 128, "Layout/LineLength: Line is too long. [248/120]", 1686898289], + [3347, 121, 132, "Layout/LineLength: Line is too long. [252/120]", 2005192241], + [3348, 121, 104, "Layout/LineLength: Line is too long. [224/120]", 1868634464], + [3349, 121, 124, "Layout/LineLength: Line is too long. [244/120]", 3939743614], + [3350, 121, 128, "Layout/LineLength: Line is too long. [248/120]", 2978506702], + [3351, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 3909866928], + [3352, 121, 118, "Layout/LineLength: Line is too long. [238/120]", 2853032177], + [3353, 121, 122, "Layout/LineLength: Line is too long. [242/120]", 2968366309], + [3354, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 1753663643], + [3355, 121, 102, "Layout/LineLength: Line is too long. [222/120]", 3387619436], + [3356, 121, 106, "Layout/LineLength: Line is too long. [226/120]", 197895496], + [3357, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 576181861], + [3358, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 2809313444], + [3359, 121, 102, "Layout/LineLength: Line is too long. [222/120]", 3963067112], + [3360, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 1121380327], + [3361, 121, 100, "Layout/LineLength: Line is too long. [220/120]", 31591211], + [3362, 121, 104, "Layout/LineLength: Line is too long. [224/120]", 1946129497], + [3363, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 767185096], + [3364, 121, 100, "Layout/LineLength: Line is too long. [220/120]", 1092646020], + [3365, 121, 104, "Layout/LineLength: Line is too long. [224/120]", 1328841270], + [3366, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 2663749624], + [3367, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 430318647], + [3368, 121, 72, "Layout/LineLength: Line is too long. [192/120]", 1650234037], + [3369, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 1082269805], + [3370, 121, 92, "Layout/LineLength: Line is too long. [212/120]", 316397809], + [3371, 121, 92, "Layout/LineLength: Line is too long. [212/120]", 3145391348], + [3372, 121, 112, "Layout/LineLength: Line is too long. [232/120]", 2808088654], + [3373, 121, 116, "Layout/LineLength: Line is too long. [236/120]", 1035513748], + [3374, 121, 92, "Layout/LineLength: Line is too long. [212/120]", 2552800539], + [3375, 121, 112, "Layout/LineLength: Line is too long. [232/120]", 1727699169], + [3376, 121, 116, "Layout/LineLength: Line is too long. [236/120]", 1171566267], + [3377, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 2994775049], + [3378, 121, 110, "Layout/LineLength: Line is too long. [230/120]", 3860489151], + [3379, 121, 114, "Layout/LineLength: Line is too long. [234/120]", 959496607], + [3380, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 1694222439], + [3381, 121, 114, "Layout/LineLength: Line is too long. [234/120]", 1501186331], + [3382, 121, 118, "Layout/LineLength: Line is too long. [238/120]", 4059659418], + [3383, 121, 110, "Layout/LineLength: Line is too long. [230/120]", 1899868779], + [3384, 121, 130, "Layout/LineLength: Line is too long. [250/120]", 323324279], + [3385, 121, 134, "Layout/LineLength: Line is too long. [254/120]", 3956414359], + [3386, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 3506644741], + [3387, 121, 116, "Layout/LineLength: Line is too long. [236/120]", 936139074], + [3388, 121, 136, "Layout/LineLength: Line is too long. [256/120]", 4153213512], + [3389, 121, 140, "Layout/LineLength: Line is too long. [260/120]", 1491976338], + [3390, 121, 102, "Layout/LineLength: Line is too long. [222/120]", 4061753206], + [3391, 121, 106, "Layout/LineLength: Line is too long. [226/120]", 2410434304], + [3392, 121, 124, "Layout/LineLength: Line is too long. [244/120]", 3518300264], + [3393, 121, 144, "Layout/LineLength: Line is too long. [264/120]", 1040696046], + [3394, 121, 148, "Layout/LineLength: Line is too long. [268/120]", 139604188], + [3395, 121, 120, "Layout/LineLength: Line is too long. [240/120]", 231937793], + [3396, 121, 140, "Layout/LineLength: Line is too long. [260/120]", 1835509805], + [3397, 121, 144, "Layout/LineLength: Line is too long. [264/120]", 1629218396], + [3398, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 2312875700], + [3399, 121, 102, "Layout/LineLength: Line is too long. [222/120]", 2933374083], + [3400, 121, 106, "Layout/LineLength: Line is too long. [226/120]", 1719349671], + [3401, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 2555579810], + [3402, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 2023551624], + [3403, 121, 114, "Layout/LineLength: Line is too long. [234/120]", 955231924], + [3404, 121, 118, "Layout/LineLength: Line is too long. [238/120]", 4232993781], + [3405, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 3472954835], + [3406, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 3211922285], + [3407, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 2874956332], + [3408, 121, 102, "Layout/LineLength: Line is too long. [222/120]", 1360335840], + [3409, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2135379556], + [3410, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3242768475], + [3411, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 2789115918], + [3412, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 3346448124], + [3413, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1538469817], + [3414, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 1543041113], + [3415, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 3344741438], + [3416, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2188404009], + [3417, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 1330398779], + [3418, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 332468826], + [3419, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 1905397598], + [3420, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 438831062], + [3421, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 3377667334], + [3422, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3232541734], + [3424, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2130930429], + [3425, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 3684939371], + [3427, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2361951097], + [3428, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 1211447462], + [3429, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3309872691], + [3430, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 360053761], + [3431, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 1310136493], + [3432, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 1950686342], + [3433, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 1397845826], + [3434, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 4191304724], + [3435, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2354128498], + [3436, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 1865717453], + [3437, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 24220542], + [3438, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 2618612673], + [3441, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 3422918867], + [3442, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 3689431739], + [3486, 121, 47, "Layout/LineLength: Line is too long. [167/120]", 4093564799], + [3492, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1662653970], + [3493, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 3967501655], + [3494, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2178516622], + [3495, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 1345346561], + [3509, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193466072], + [3629, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 3612393276], + [3630, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 797303985], + [3633, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1606320605], + [3653, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1776876782], + [3657, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 828742791], + [3677, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 3294617581], + [3687, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 3519842846], + [3697, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1966440909], + [3698, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 830053864], + [3704, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1606320605], + [3727, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 1340744311], + [3746, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1741893077], + [3747, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 830053865], + [3751, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193405204], + [3765, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1401226501], + [3768, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2085352569], + [3771, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 696523922], + [3786, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 182097675], + [3796, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2746826653], + [4212, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 1138870161], + [4774, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], + [4785, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 2132299307], + [4832, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087775098], + [4843, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 757851079], + [4879, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], + [4890, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 441649198], + [4913, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087903295], + [4925, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 170442008], + [4934, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2102137893], + [4936, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 1888875443], + [4973, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 398433651], + [4984, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3921367744], + [5007, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2422819473], + [5013, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 194583095], + [5019, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1901385496], + [5028, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 490810486], + [5030, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 586287746], + [5034, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1310969752], + [5054, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087389205], + [5066, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2609063547], + [5075, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2102137893], + [5077, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 1370761696], + [5100, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 2208661169], + [5106, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1862604658], + [5112, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 3958789371], + [5121, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 3449594464], + [5123, 121, 37, "Layout/LineLength: Line is too long. [157/120]", 692050524], + [5127, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 802172558], + [5197, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 2406691660], + [5232, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], + [5243, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 1811982742], + [5270, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2562189319], + [5276, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193430346], + [5282, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 2814237166], + [5291, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2189106693], + [5293, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 3874870868], + [5297, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 179474914], + [5330, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1751845165], + [5341, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2617230371], + [5345, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], + [5386, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], + [5397, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3793790598], + [5432, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 4088312783], + [5443, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3220724736], + [5447, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087899888], + [5466, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2552888401], + [5472, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 194583095], + [5478, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2414559905], + [5487, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 626762179], + [5489, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 3969284923], + [5493, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 1893261414], + [5525, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2133507320], + [5536, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 2101353476], + [5540, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087685705], + [5559, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2431380437], + [5565, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 194583095], + [5571, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 435489438], + [5580, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 1520878209], + [5582, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 2238995076], + [5586, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 2789405913], + [5619, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], + [5630, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3409328196], + [5653, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087858069], + [5665, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2811935086], + [5674, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2102137893], + [5676, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 1113346693], + [5680, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3227128786], + [5700, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 48793812], + [5706, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 338440584], + [5712, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 735248703], + [5721, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 927473097], + [5723, 121, 43, "Layout/LineLength: Line is too long. [163/120]", 1394536741], + [5727, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 3134012967], + [5746, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 2967615316], + [5752, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 2810710931], + [5758, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 2548594701], + [5761, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860796], + [5763, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 182097675], + [5767, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 3549194295], + [5769, 121, 55, "Layout/LineLength: Line is too long. [175/120]", 1074004741], + [5773, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 2874423564], + [5776, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087576526], + [5778, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 182097675], + [5793, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 1696848307], + [5799, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 2883501659], + [5805, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 3056443076], + [5810, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193405204], + [5814, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 1487412605], + [5816, 121, 51, "Layout/LineLength: Line is too long. [171/120]", 2021571284], + [5820, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 1975782995], + [5823, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860796], + [5825, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193405204], + [5830, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 183236849], + [5839, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 856018753], + [5842, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], + [5845, 121, 37, "Layout/LineLength: Line is too long. [157/120]", 2146546324], + [5851, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3913983076], + [5854, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 3491931666], + [5856, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 3536323546], + [5860, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 356581191], + [5862, 121, 63, "Layout/LineLength: Line is too long. [183/120]", 4144657639], + [5866, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 1478616653], + [5869, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1774852021], + [5871, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 3536323546], + [5886, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 3884289787], + [5892, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 1001503687], + [5898, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3673836976], + [5907, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 3164908550], + [5909, 121, 43, "Layout/LineLength: Line is too long. [163/120]", 1134300778], + [5913, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 1797165224], + [5932, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 2508143995], + [5938, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 3002532188], + [5944, 121, 44, "Layout/LineLength: Line is too long. [164/120]", 584857986], + [5947, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860796], + [5949, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 182097675], + [5953, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 749691384], + [5955, 121, 55, "Layout/LineLength: Line is too long. [175/120]", 3389354954], + [5959, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 3402045699], + [5962, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087576526], + [5964, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 182097675], + [5978, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 2447716612], + [5984, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3201685099], + [5990, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 3060990885], + [5999, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 29396315], + [6001, 121, 45, "Layout/LineLength: Line is too long. [165/120]", 1228645365], + [6005, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1436742837], + [6024, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 716917214], + [6030, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 2175814211], + [6036, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 1473420390], + [6039, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193433391], + [6041, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1422839111], + [6045, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 1571170198], + [6047, 121, 57, "Layout/LineLength: Line is too long. [177/120]", 2175059093], + [6051, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 3886666417], + [6054, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 176753677], + [6056, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1422839111], + [6072, 121, 38, "Layout/LineLength: Line is too long. [158/120]", 3471319495], + [6078, 121, 33, "Layout/LineLength: Line is too long. [153/120]", 1274038477], + [6084, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 2896814693], + [6087, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087576526], + [6089, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 4114086530], + [6093, 121, 40, "Layout/LineLength: Line is too long. [160/120]", 250433828], + [6095, 121, 59, "Layout/LineLength: Line is too long. [179/120]", 3910556848], + [6099, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 4002014976], + [6102, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 3491931666], + [6104, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 4114086530], + [6198, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861664], + [6212, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087932582], + [6226, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861664], + [6242, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 876012844], + [6244, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1756764194], + [6245, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 4173216735], + [6248, 121, 75, "Layout/LineLength: Line is too long. [195/120]", 911964425], + [6249, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 173266907], + [6250, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1412705933], + [6253, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1756764194], + [6254, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 2605683750], + [6257, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 3182252139], + [6259, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 1652557742], + [6263, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 2240437058], + [6264, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 173266907], + [6265, 121, 101, "Layout/LineLength: Line is too long. [221/120]", 3694598076], + [6267, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861152], + [6268, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 179079542], + [6269, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 3528944411], + [6272, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3020159378], + [6274, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 1652557742], + [6280, 121, 84, "Layout/LineLength: Line is too long. [204/120]", 420843234], + [6282, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1401226501], + [6283, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 442915368], + [6286, 121, 79, "Layout/LineLength: Line is too long. [199/120]", 4212444955], + [6287, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 830053864], + [6288, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 1373660924], + [6291, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1401226501], + [6292, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 1539225758], + [6295, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3020159378], + [6297, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 4240691845], + [6301, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 674553335], + [6302, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 830053864], + [6303, 121, 105, "Layout/LineLength: Line is too long. [225/120]", 4163432287], + [6305, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2089555761], + [6306, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 2034687276], + [6307, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 3710905302], + [6310, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 4204667212], + [6312, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 4240691845], + [6318, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 2071493433], + [6320, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2085352569], + [6321, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 2853066942], + [6324, 121, 71, "Layout/LineLength: Line is too long. [191/120]", 2771467828], + [6325, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193425976], + [6326, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 3025157142], + [6329, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2085352569], + [6330, 121, 86, "Layout/LineLength: Line is too long. [206/120]", 3340824101], + [6333, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 3999804761], + [6335, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 1999310973], + [6339, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 835016333], + [6340, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193425976], + [6341, 121, 97, "Layout/LineLength: Line is too long. [217/120]", 3575893945], + [6344, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193405945], + [6345, 121, 72, "Layout/LineLength: Line is too long. [192/120]", 1755858308], + [6348, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 3182252139], + [6350, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 1999310973], + [6356, 121, 70, "Layout/LineLength: Line is too long. [190/120]", 3033080032], + [6358, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177549], + [6359, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 2720985203], + [6362, 121, 65, "Layout/LineLength: Line is too long. [185/120]", 3233424320], + [6364, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1165873483], + [6367, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177549], + [6368, 121, 80, "Layout/LineLength: Line is too long. [200/120]", 131859703], + [6371, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1943494546], + [6373, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 4016166830], + [6377, 121, 72, "Layout/LineLength: Line is too long. [192/120]", 1350760977], + [6379, 121, 91, "Layout/LineLength: Line is too long. [211/120]", 4098706554], + [6383, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 4059724765], + [6386, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 1651955548], + [6388, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 4016166830], + [6394, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 1057495720], + [6397, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1621971220], + [6400, 121, 49, "Layout/LineLength: Line is too long. [169/120]", 1585717593], + [6406, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 2942094233], + [6409, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2624667704], + [6411, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 2317051977], + [6415, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 1321610634], + [6417, 121, 75, "Layout/LineLength: Line is too long. [195/120]", 2854688831], + [6421, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 4185465554], + [6424, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1169781875], + [6426, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 2317051977], + [6432, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 1916545020], + [6435, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1422839111], + [6438, 121, 45, "Layout/LineLength: Line is too long. [165/120]", 910134593], + [6444, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 203086561], + [6447, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2939363812], + [6449, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3155638331], + [6453, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 1955758062], + [6455, 121, 71, "Layout/LineLength: Line is too long. [191/120]", 3737424359], + [6459, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 3597620692], + [6462, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2624667704], + [6464, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3155638331], + [6470, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 1036052399], + [6473, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 4114086530], + [6476, 121, 47, "Layout/LineLength: Line is too long. [167/120]", 1268266488], + [6482, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 2791598354], + [6485, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1302589368], + [6487, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3533902728], + [6491, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 3942276897], + [6493, 121, 73, "Layout/LineLength: Line is too long. [193/120]", 1175941460], + [6497, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 679697318], + [6500, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 28126263], + [6502, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3533902728], + [6503, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 181895237], + [6508, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 4057848448], + [6511, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 4114086530], + [6514, 121, 47, "Layout/LineLength: Line is too long. [167/120]", 4067769399], + [6520, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 461482909], + [6523, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1302589368], + [6525, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3533902728], + [6529, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 3561204590], + [6531, 121, 73, "Layout/LineLength: Line is too long. [193/120]", 880160795], + [6535, 121, 48, "Layout/LineLength: Line is too long. [168/120]", 1614719145], + [6538, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 28126263], + [6540, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 3533902728], + [6541, 121, 5, "Layout/LineLength: Line is too long. [125/120]", 181895237], + [6588, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193432306], + [6602, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 1645945966], + [6605, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3212740609], + [6608, 121, 59, "Layout/LineLength: Line is too long. [179/120]", 3982698123], + [6610, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193425997], + [6614, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 2663750402], + [6617, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2420297272], + [6619, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1164389943], + [6623, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 3483121581], + [6625, 121, 85, "Layout/LineLength: Line is too long. [205/120]", 2271668600], + [6629, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 804794365], + [6632, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3659367004], + [6634, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1164389943], + [6635, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 561395486], + [6640, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 1251661057], + [6643, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3212740609], + [6646, 121, 59, "Layout/LineLength: Line is too long. [179/120]", 3210109508], + [6648, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193425997], + [6652, 121, 74, "Layout/LineLength: Line is too long. [194/120]", 430316685], + [6655, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2420297272], + [6657, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1164389943], + [6661, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 2428160226], + [6663, 121, 85, "Layout/LineLength: Line is too long. [205/120]", 2663295671], + [6667, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 2822109938], + [6670, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3659367004], + [6672, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1164389943], + [6673, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 561395486], + [6678, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 857639785], + [6681, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 3669622788], + [6684, 121, 57, "Layout/LineLength: Line is too long. [177/120]", 140453799], + [6686, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860765], + [6690, 121, 72, "Layout/LineLength: Line is too long. [192/120]", 1650236431], + [6693, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 150699323], + [6695, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 50618962], + [6699, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 4205571164], + [6701, 121, 83, "Layout/LineLength: Line is too long. [203/120]", 1549528021], + [6705, 121, 58, "Layout/LineLength: Line is too long. [178/120]", 1325488145], + [6708, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 1510711065], + [6710, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 50618962], + [6716, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 3043205563], + [6719, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2381137493], + [6722, 121, 61, "Layout/LineLength: Line is too long. [181/120]", 2200345195], + [6724, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087926498], + [6728, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 1082269527], + [6731, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 1510711065], + [6733, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 1104064739], + [6737, 121, 68, "Layout/LineLength: Line is too long. [188/120]", 1652941658], + [6739, 121, 87, "Layout/LineLength: Line is too long. [207/120]", 1440323819], + [6743, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 802896260], + [6746, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1943494546], + [6748, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 1104064739], + [6754, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 788730815], + [6756, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 2034687276], + [6757, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 4226330106], + [6760, 121, 77, "Layout/LineLength: Line is too long. [197/120]", 2414796320], + [6761, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1165873470], + [6762, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 3090817832], + [6765, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 2034687276], + [6766, 121, 92, "Layout/LineLength: Line is too long. [212/120]", 2839148677], + [6769, 121, 26, "Layout/LineLength: Line is too long. [146/120]", 2393983240], + [6771, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 2581936864], + [6775, 121, 84, "Layout/LineLength: Line is too long. [204/120]", 3923254945], + [6776, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1165873470], + [6777, 121, 103, "Layout/LineLength: Line is too long. [223/120]", 580639726], + [6779, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193419246], + [6780, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1756764194], + [6781, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 3202758044], + [6784, 121, 28, "Layout/LineLength: Line is too long. [148/120]", 912651721], + [6786, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 2581936864], + [6790, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1164293389], + [6803, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5860840], + [6804, 121, 88, "Layout/LineLength: Line is too long. [208/120]", 574552570], + [6806, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3845073641], + [6807, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 543375177], + [6810, 121, 83, "Layout/LineLength: Line is too long. [203/120]", 222410330], + [6811, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 3025157219], + [6812, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 1904561434], + [6815, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 489872984], + [6816, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 97325617], + [6819, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 4204667212], + [6821, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 4062673070], + [6825, 121, 90, "Layout/LineLength: Line is too long. [210/120]", 1451915960], + [6826, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 3025157219], + [6827, 121, 109, "Layout/LineLength: Line is too long. [229/120]", 4200529758], + [6829, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1497831350], + [6830, 121, 9, "Layout/LineLength: Line is too long. [129/120]", 4214367244], + [6831, 121, 84, "Layout/LineLength: Line is too long. [204/120]", 399603517], + [6834, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 3423548875], + [6836, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 4062673070], + [6840, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 3279830097], + [6852, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 659167322], + [6864, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087926423], + [6865, 121, 57, "Layout/LineLength: Line is too long. [177/120]", 3300294193], + [6867, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 3172850966], + [6868, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 2396187736], + [6871, 121, 87, "Layout/LineLength: Line is too long. [207/120]", 1991888901], + [6872, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1954380402], + [6873, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2589970962], + [6876, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 42340644], + [6877, 121, 67, "Layout/LineLength: Line is too long. [187/120]", 479235996], + [6880, 121, 31, "Layout/LineLength: Line is too long. [151/120]", 3423548875], + [6882, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 1462541970], + [6886, 121, 94, "Layout/LineLength: Line is too long. [214/120]", 1373978781], + [6887, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1954380402], + [6888, 121, 78, "Layout/LineLength: Line is too long. [198/120]", 280641011], + [6890, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1664110553], + [6891, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 1009650381], + [6892, 121, 88, "Layout/LineLength: Line is too long. [208/120]", 909329343], + [6895, 121, 33, "Layout/LineLength: Line is too long. [153/120]", 2977589831], + [6897, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 1462541970], + [6902, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1165873470], + [6903, 121, 61, "Layout/LineLength: Line is too long. [181/120]", 1904101094], + [6905, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2229256255], + [6906, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 1839090017], + [6909, 121, 91, "Layout/LineLength: Line is too long. [211/120]", 4260980907], + [6910, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 4253118453], + [6911, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 1536690221], + [6913, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861152], + [6914, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 209824656], + [6915, 121, 71, "Layout/LineLength: Line is too long. [191/120]", 1530496074], + [6918, 121, 33, "Layout/LineLength: Line is too long. [153/120]", 2977589831], + [6920, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 3261436902], + [6924, 121, 98, "Layout/LineLength: Line is too long. [218/120]", 3762694917], + [6925, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 4253118453], + [6926, 121, 82, "Layout/LineLength: Line is too long. [202/120]", 3196230010], + [6928, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3165598659], + [6929, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 4264469493], + [6930, 121, 92, "Layout/LineLength: Line is too long. [212/120]", 3140690958], + [6933, 121, 35, "Layout/LineLength: Line is too long. [155/120]", 2999583208], + [6935, 121, 36, "Layout/LineLength: Line is too long. [156/120]", 3261436902], + [6941, 121, 54, "Layout/LineLength: Line is too long. [174/120]", 326070599], + [6944, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 1621971220], + [6947, 121, 49, "Layout/LineLength: Line is too long. [169/120]", 1689000214], + [6953, 121, 64, "Layout/LineLength: Line is too long. [184/120]", 2459904022], + [6956, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2624667704], + [6958, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 2317051977], + [6962, 121, 56, "Layout/LineLength: Line is too long. [176/120]", 2842872837], + [6964, 121, 75, "Layout/LineLength: Line is too long. [195/120]", 423884656], + [6968, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 2673769885], + [6971, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 1169781875], + [6973, 121, 15, "Layout/LineLength: Line is too long. [135/120]", 2317051977], + [6974, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2126253911], + [6990, 121, 66, "Layout/LineLength: Line is too long. [186/120]", 2388292564], + [6993, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2381137493], + [6996, 121, 61, "Layout/LineLength: Line is too long. [181/120]", 1136762660], + [6998, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087926498], + [7002, 121, 76, "Layout/LineLength: Line is too long. [196/120]", 2555581016], + [7005, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 1510711065], + [7007, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 1104064739], + [7011, 121, 68, "Layout/LineLength: Line is too long. [188/120]", 1986812885], + [7013, 121, 87, "Layout/LineLength: Line is too long. [207/120]", 1864036132], + [7017, 121, 62, "Layout/LineLength: Line is too long. [182/120]", 3590180043], + [7020, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1943494546], + [7022, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 1104064739], + [7023, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2382712010], + [7033, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1791534645], + [7038, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 2403815412], + [7041, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1422839111], + [7044, 121, 45, "Layout/LineLength: Line is too long. [165/120]", 4046048864], + [7050, 121, 60, "Layout/LineLength: Line is too long. [180/120]", 3472955113], + [7053, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 2939363812], + [7055, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3155638331], + [7059, 121, 52, "Layout/LineLength: Line is too long. [172/120]", 3911469720], + [7061, 121, 71, "Layout/LineLength: Line is too long. [191/120]", 272433263], + [7065, 121, 46, "Layout/LineLength: Line is too long. [166/120]", 634420444], + [7068, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2624667704], + [7070, 121, 13, "Layout/LineLength: Line is too long. [133/120]", 3155638331], + [7071, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2088324682], + [7084, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087906711], + [7096, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2135380894], + [7105, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2102137893], + [7107, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 4280757685], + [7111, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 161599970], + [7145, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 830053789], + [7180, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 2188407955], + [7191, 121, 19, "Layout/LineLength: Line is too long. [139/120]", 3692322233], + [7195, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087557694], + [7218, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 3197512522], + [7227, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5858840], + [7229, 121, 21, "Layout/LineLength: Line is too long. [141/120]", 85298067], + [7286, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193418403], + [7292, 121, 3, "Layout/LineLength: Line is too long. [123/120]", 193418403], + [7315, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087432474], + [7327, 121, 14, "Layout/LineLength: Line is too long. [134/120]", 2361949763], + [7336, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 2102137893], + [7338, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 581045160], + [7342, 121, 10, "Layout/LineLength: Line is too long. [130/120]", 4235011647], + [7361, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1898147766], + [7367, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177560], + [7373, 121, 16, "Layout/LineLength: Line is too long. [136/120]", 1310140439], + [7382, 121, 8, "Layout/LineLength: Line is too long. [128/120]", 681770239], + [7384, 121, 27, "Layout/LineLength: Line is too long. [147/120]", 3821940657], + [7388, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5862609], + [7408, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861292], + [7420, 121, 12, "Layout/LineLength: Line is too long. [132/120]", 2354124424], + [7429, 121, 4, "Layout/LineLength: Line is too long. [124/120]", 2087922021], + [7431, 121, 23, "Layout/LineLength: Line is too long. [143/120]", 3921370162], + [8024, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 4083054536], + [8052, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 4083054536], + [8081, 121, 24, "Layout/LineLength: Line is too long. [144/120]", 4083054536], + [8139, 121, 42, "Layout/LineLength: Line is too long. [162/120]", 632953222], + [8168, 121, 34, "Layout/LineLength: Line is too long. [154/120]", 732995265], + [8218, 121, 30, "Layout/LineLength: Line is too long. [150/120]", 1886249927], + [8380, 121, 7, "Layout/LineLength: Line is too long. [127/120]", 578751979], + [8381, 121, 11, "Layout/LineLength: Line is too long. [131/120]", 3803540269], + [8390, 121, 17, "Layout/LineLength: Line is too long. [137/120]", 2238403955], + [8391, 121, 25, "Layout/LineLength: Line is too long. [145/120]", 1028441932], + [8392, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 1975950909], + [8447, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1244043798] ], "spec/integration/freeze_node_edge_cases_spec.rb:3416491031": [ [6, 1, 28959, "Metrics/BlockLength: Block has too many lines. [663/25]", 3473768018], diff --git a/gems/ast-merge/.simplecov b/gems/ast-merge/.simplecov index 20dd86e49..0372395aa 100644 --- a/gems/ast-merge/.simplecov +++ b/gems/ast-merge/.simplecov @@ -4,15 +4,11 @@ # ast-merge will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/ast-merge/.structuredmerge/kettle-jem.yml b/gems/ast-merge/.structuredmerge/kettle-jem.yml index dd1a4c369..9a1835b77 100644 --- a/gems/ast-merge/.structuredmerge/kettle-jem.yml +++ b/gems/ast-merge/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/ast/merge/version.rb - source: sig/gem.rbs diff --git a/gems/ast-merge/Gemfile b/gems/ast-merge/Gemfile index c4d51f141..92d1177b1 100644 --- a/gems/ast-merge/Gemfile +++ b/gems/ast-merge/Gemfile @@ -37,298 +37,6 @@ if direct_sibling_gems.any? && direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local @@ -351,62 +59,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -414,7 +68,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/ast-merge/Gemfile.lock b/gems/ast-merge/Gemfile.lock index ad09d9372..761bc7971 100644 --- a/gems/ast-merge/Gemfile.lock +++ b/gems/ast-merge/Gemfile.lock @@ -7,271 +7,6 @@ PATH tree_haver (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,6 +17,10 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) backports (3.25.3) benchmark (0.5.0) @@ -289,15 +28,10 @@ GEM bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +39,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +69,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +88,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +112,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,7 +121,6 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) mutex_m (0.3.0) nokogiri (1.19.4-aarch64-linux-gnu) racc (~> 1.4) @@ -398,13 +128,11 @@ GEM racc (~> 1.4) nokogiri (1.19.4-arm64-darwin) racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-musl) racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +153,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +208,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +223,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +262,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -530,28 +283,22 @@ GEM ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) - service_actor (3.9.4) - zeitwerk (>= 1.0) silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +311,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +334,20 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-aarch64-linux) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-arm64-darwin) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +357,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -628,116 +388,76 @@ PLATFORMS aarch64-linux-gnu aarch64-linux-musl arm64-darwin - x86_64-darwin + x86_64-linux x86_64-linux-gnu x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.0, >= 3.0.6) - ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! + appraisal2-rubocop (~> 1.0, >= 1.0.0) ast-merge! - ast-merge-git! - ast-template! - bash-merge! - benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! - commonmarker-merge! + cgi (~> 0.5) debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.0) - go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.0, >= 2.2.25) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) + kettle-soup-cover (~> 3.0, >= 3.0.3) kettle-test (~> 2.0, >= 2.0.9) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) + standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.3) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + tree_sitter_language_pack (~> 1.13, >= 1.13.3) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 - ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.16) sha256=d6ca5dd440c24f9abce9844cf44cc8e18c6a553de65a47efb4544137af92c47d bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -746,61 +466,46 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 - json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 - markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -818,35 +523,37 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) - service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -855,20 +562,18 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-aarch64-linux) sha256=55ffc7c87868cb45658338363d9eba51b4a8b0259aa88e4de368d2bd1d52fea4 + tree_sitter_language_pack (1.13.3-arm64-darwin) sha256=bc2498db605f212a1dbd2465ed3f65190d7da786f6ed5d30fcf958121aeb4a5c + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -876,7 +581,6 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH diff --git a/gems/ast-merge/README.md b/gems/ast-merge/README.md index bf0c8c062..eb322157f 100644 --- a/gems/ast-merge/README.md +++ b/gems/ast-merge/README.md @@ -307,7 +307,7 @@ The `Ast::Merge` module is organized into several namespaces, each with detailed | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | | Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | @@ -526,6 +526,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-merge [⛳️namespace-img]: https://img.shields.io/badge/namespace-Ast::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white diff --git a/gems/ast-merge/gemfiles/modular/benchmark/r4/v0.5.gemfile b/gems/ast-merge/gemfiles/modular/benchmark/r4/v0.5.gemfile index b8392fab0..e69de29bb 100644 --- a/gems/ast-merge/gemfiles/modular/benchmark/r4/v0.5.gemfile +++ b/gems/ast-merge/gemfiles/modular/benchmark/r4/v0.5.gemfile @@ -1,2 +0,0 @@ -# Ruby >= 2.1 -gem 'benchmark', '~> 0.5', '>= 0.5.0' # Removed from Std Lib in Ruby 4.0 diff --git a/gems/ast-merge/gemfiles/modular/benchmark/vHEAD.gemfile b/gems/ast-merge/gemfiles/modular/benchmark/vHEAD.gemfile index af214aafa..e69de29bb 100644 --- a/gems/ast-merge/gemfiles/modular/benchmark/vHEAD.gemfile +++ b/gems/ast-merge/gemfiles/modular/benchmark/vHEAD.gemfile @@ -1,2 +0,0 @@ -# Ruby >= 2.1 -gem 'benchmark', github: 'ruby/benchmark', branch: 'master' diff --git a/gems/ast-merge/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/ast-merge/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/ast-merge/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/ast-merge/gemfiles/modular/cgi/vHEAD.gemfile b/gems/ast-merge/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/ast-merge/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/ast-merge/gemfiles/modular/coverage.gemfile b/gems/ast-merge/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/ast-merge/gemfiles/modular/coverage.gemfile +++ b/gems/ast-merge/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/ast-merge/gemfiles/modular/coverage_local.gemfile b/gems/ast-merge/gemfiles/modular/coverage_local.gemfile index 073a73f58..316d764dd 100644 --- a/gems/ast-merge/gemfiles/modular/coverage_local.gemfile +++ b/gems/ast-merge/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require "nomono/bundler" local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[ast-merge] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-merge/gemfiles/modular/documentation.gemfile b/gems/ast-merge/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/ast-merge/gemfiles/modular/documentation.gemfile +++ b/gems/ast-merge/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/ast-merge/gemfiles/modular/documentation_local.gemfile b/gems/ast-merge/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..18e1ba3b3 100644 --- a/gems/ast-merge/gemfiles/modular/documentation_local.gemfile +++ b/gems/ast-merge/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require "nomono/bundler" local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-merge] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/ast-merge/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/ast-merge/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-merge/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/ast-merge/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-merge/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/ast-merge/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-merge/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/ast-merge/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-merge/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/ast-merge/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/ast-merge/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/ast-merge/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/ast-merge/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/ast-merge/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/ast-merge/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/ast-merge/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/ast-merge/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/ast-merge/gemfiles/modular/optional.gemfile b/gems/ast-merge/gemfiles/modular/optional.gemfile index 74f15a196..9ea429538 100644 --- a/gems/ast-merge/gemfiles/modular/optional.gemfile +++ b/gems/ast-merge/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/ast-merge/gemfiles/modular/runtime_heads.gemfile b/gems/ast-merge/gemfiles/modular/runtime_heads.gemfile index 78bdc2227..ebf17c529 100644 --- a/gems/ast-merge/gemfiles/modular/runtime_heads.gemfile +++ b/gems/ast-merge/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/ast-merge/gemfiles/modular/style.gemfile b/gems/ast-merge/gemfiles/modular/style.gemfile index 002341f21..4dbcc02c0 100644 --- a/gems/ast-merge/gemfiles/modular/style.gemfile +++ b/gems/ast-merge/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during ast-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/ast-merge/gemfiles/modular/style_local.gemfile b/gems/ast-merge/gemfiles/modular/style_local.gemfile index ce75bbe21..73e4e724b 100644 --- a/gems/ast-merge/gemfiles/modular/style_local.gemfile +++ b/gems/ast-merge/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require "nomono/bundler" local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-merge] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/ast-merge/gemfiles/modular/templating.gemfile b/gems/ast-merge/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/ast-merge/gemfiles/modular/templating.gemfile +++ b/gems/ast-merge/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/ast-merge/gemfiles/modular/templating_local.gemfile b/gems/ast-merge/gemfiles/modular/templating_local.gemfile index bf5147854..b0c887fb3 100644 --- a/gems/ast-merge/gemfiles/modular/templating_local.gemfile +++ b/gems/ast-merge/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require "nomono/bundler" structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-merge] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-merge] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[ast-merge] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-merge/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/ast-merge/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/ast-merge/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/ast-merge/gemfiles/modular/webrick/vHEAD.gemfile b/gems/ast-merge/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/ast-merge/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/ast-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/ast-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/ast-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/ast-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/ast-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/ast-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/ast-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/ast-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/ast-merge/lib/ast/merge.rb b/gems/ast-merge/lib/ast/merge.rb index c901dd747..3f9d5625f 100644 --- a/gems/ast-merge/lib/ast/merge.rb +++ b/gems/ast-merge/lib/ast/merge.rb @@ -70,9 +70,11 @@ def initialize(placeholder) autoload :FileAnalyzable, 'ast/merge/file_analyzable' autoload :Freezable, 'ast/merge/freezable' autoload :FreezeNodeBase, 'ast/merge/freeze_node_base' + autoload :CommentLayoutEmissionSupport, 'ast/merge/comment_layout_emission_support' autoload :Healer, 'ast/merge/healer' autoload :JaccardSimilarity, 'ast/merge/jaccard_similarity' autoload :Layout, 'ast/merge/layout' + autoload :LineRangeSupport, 'ast/merge/line_range_support' autoload :MatchRefinerBase, 'ast/merge/match_refiner_base' autoload :MatchScoreBase, 'ast/merge/match_score_base' autoload :MergeResultBase, 'ast/merge/merge_result_base' @@ -85,6 +87,7 @@ def initialize(placeholder) autoload :PartialTemplateMergerBase, 'ast/merge/partial_template_merger_base' autoload :SectionTyping, 'ast/merge/section_typing' autoload :SmartMergerBase, 'ast/merge/smart_merger_base' + autoload :SourceRegionReportSupport, 'ast/merge/source_region_report_support' autoload :StructuralEdit, 'ast/merge/structural_edit' autoload :StructuredEmitterProvenanceSupport, 'ast/merge/structured_emitter_provenance_support' autoload :StructuredReviewApplySupport, 'ast/merge/structured_review_apply_support' @@ -847,7 +850,7 @@ def to_h :path_placeholder, :expected_exit_code, :expected_current_file_updated, keyword_init: true) GitDriverSmokeSuite = Struct.new(:suite_id, :version, :driver_name, :cases, :diagnostics, keyword_init: true) DiffDriverSmokeCase = Struct.new(:case_id, :argument_count, :argument_roles, :expected_exit_code, - :expected_output_kind, keyword_init: true) + :expected_output_kind, :expected_output_fragments, keyword_init: true) DiffDriverSmokeSuite = Struct.new(:suite_id, :version, :driver_name, :cases, :diagnostics, keyword_init: true) PerformanceTimeoutDiagnostic = Struct.new(:severity, :category, :code, :fallback, keyword_init: true) PerformanceGuardrails = Struct.new(:guardrail_id, :version, :max_bytes, :max_nodes, :max_match_candidates, diff --git a/gems/ast-merge/lib/ast/merge/comment_layout_emission_support.rb b/gems/ast-merge/lib/ast/merge/comment_layout_emission_support.rb new file mode 100644 index 000000000..679fc54e1 --- /dev/null +++ b/gems/ast-merge/lib/ast/merge/comment_layout_emission_support.rb @@ -0,0 +1,376 @@ +# frozen_string_literal: true + +module Ast + module Merge + # Shared helpers for merge emitters that reconstruct source regions around + # structural owners while preserving comment and blank-line ownership. + # + # Format-specific gems still decide which comments are syntax comments and + # which owners participate in a merge. This module centralizes the + # language-neutral mechanics for querying attachments and calculating the + # source span that should be emitted for an owner. + module CommentLayoutEmissionSupport + include LineRangeSupport + + private + + def leading_region_for(owner, analysis, owners: nil) + return unless owner && analysis&.respond_to?(:comment_attachment_for) + + attachment = if owners.nil? + analysis.comment_attachment_for(owner) + else + analysis.comment_attachment_for(owner, owners: owners) + end + attachment.leading_region if attachment.respond_to?(:leading_region) + end + + def trailing_region_for(owner, analysis, owners: nil) + return unless owner && analysis&.respond_to?(:comment_attachment_for) + + attachment = if owners.nil? + analysis.comment_attachment_for(owner) + else + analysis.comment_attachment_for(owner, owners: owners) + end + attachment.trailing_region if attachment.respond_to?(:trailing_region) + end + + def region_present?(region) + return false unless region + return !region.empty? if region.respond_to?(:empty?) + return region.nodes.any? if region.respond_to?(:nodes) + + true + end + + def region_start_line(region) + return region.start_line if region.respond_to?(:start_line) && region.start_line + return unless region.respond_to?(:nodes) + + region.nodes.filter_map { |node| node.respond_to?(:line_number) ? node.line_number : nil }.min + end + + def region_end_line(region) + return region.end_line if region.respond_to?(:end_line) && region.end_line + return unless region.respond_to?(:nodes) + + region.nodes.filter_map { |node| node.respond_to?(:line_number) ? node.line_number : nil }.max + end + + def preceding_blank_line_start(region_start, analysis) + line_num = region_start + while line_num && line_num > 1 + previous_line = source_line_at(analysis, line_num - 1) + break unless previous_line && previous_line.strip.empty? + + line_num -= 1 + end + + line_num + end + + def blank_line_count_before(line_num, analysis) + count = 0 + current = line_num.to_i - 1 + + while current >= 1 + previous_line = source_line_at(analysis, current) + break unless previous_line && previous_line.strip.empty? + + count += 1 + current -= 1 + end + + count + end + + def leading_segment_start_for_output(output_owner:, output_analysis:, source_region_start:, source_analysis:, + source_region: nil, owners: nil) + source_region_start - desired_blank_line_count_before_leading_region( + output_owner: output_owner, + output_analysis: output_analysis, + source_region_start: source_region_start, + source_region: source_region, + source_analysis: source_analysis, + owners: owners + ) + end + + def desired_blank_line_count_before_leading_region(output_owner:, output_analysis:, source_region_start:, + source_analysis:, source_region: nil, owners: nil) + target_region = leading_region_for(output_owner, output_analysis, owners: owners) + target_region_start = region_start_line(target_region) + output_start_line = owner_start_line(output_owner) + + if target_region_start && output_start_line && target_region_start < output_start_line + blank_line_count_before(target_region_start, output_analysis) + elsif source_region && previous_owner_trailing_region_matches?(output_owner, output_analysis, source_region, + owners: owners) + 0 + else + blank_line_count_before(source_region_start, source_analysis) + end + end + + def leading_segment_lines_for(owner, analysis, owners: nil) + leading_segment_line_numbers_for(owner, analysis, owners: owners).filter_map do |line_number| + source_line_at(analysis, line_number) + end + end + + def leading_segment_line_numbers_for(owner, analysis, owners: nil) + leading_region = leading_region_for(owner, analysis, owners: owners) + region_start = leading_segment_anchor_line_for(owner, analysis, owners: owners, leading_region: leading_region) + owner_start = owner_start_line(owner) + return [] unless region_start && owner_start && region_start < owner_start + + leading_start = leading_segment_start_for_output( + output_owner: owner, + output_analysis: analysis, + source_region_start: region_start, + source_region: leading_region, + source_analysis: analysis, + owners: owners + ) + (leading_start...owner_start).to_a + end + + def leading_segment_anchor_line_for(_owner, _analysis, owners: nil, leading_region: nil) + return unless region_present?(leading_region) + + region_start_line(leading_region) + end + + def trailing_region_lines_for(owner, analysis, owners: nil) + region_lines_for(trailing_region_for(owner, analysis, owners: owners)) + end + + def trailing_region_line_numbers_for(owner, analysis, owners: nil) + region_line_numbers_for(trailing_region_for(owner, analysis, owners: owners)) + end + + def removed_owner_preserved_lines_for(owner, analysis, owners: nil, inline_lines: []) + attachment = analysis.comment_attachment_for(owner, owners: owners) + lines = leading_segment_lines_for(owner, analysis, owners: owners) + lines.concat(Array(inline_lines).compact) + lines.concat(region_lines_for(attachment&.trailing_region)) + + trailing_gap = attachment&.trailing_gap + lines.concat(trailing_gap.lines) if trailing_gap&.effective_controller_side(removed_owners: [owner]) == :after + + lines + end + + def removed_owner_preserved_line_numbers_for(owner, analysis, owners: nil, inline_line_numbers: []) + attachment = analysis.comment_attachment_for(owner, owners: owners) + line_numbers = leading_segment_line_numbers_for(owner, analysis, owners: owners) + line_numbers.concat(Array(inline_line_numbers).compact) + line_numbers.concat(region_line_numbers_for(attachment&.trailing_region)) + + trailing_gap = attachment&.trailing_gap + if trailing_gap&.effective_controller_side(removed_owners: [owner]) == :after + line_numbers.concat((trailing_gap.start_line..trailing_gap.end_line).to_a) + end + + line_numbers + end + + def interstitial_trailing_region_lines_for(owner, analysis, owners: nil) + return [] unless next_owner_for(owner, analysis, owners: owners) + + trailing_region_lines_for(owner, analysis, owners: owners) + end + + def retained_owner_leading_gap_lines_for(owner, analysis, owners: nil) + gap = retained_owner_leading_gap_for(owner, analysis, owners: owners) + return [] unless gap + return [] if region_present?(leading_region_for(owner, analysis, owners: owners)) + + gap.lines + end + + def retained_owner_leading_gap_for(owner, analysis, owners: nil) + return unless owner && analysis&.respond_to?(:layout_attachment_for) + + attachment = if owners.nil? + analysis.layout_attachment_for(owner) + else + analysis.layout_attachment_for(owner, owners: owners) + end + gap = attachment&.leading_gap + return unless gap&.kind == :interstitial + + gap + end + + def previous_owner_trailing_region_matches?(owner, analysis, source_region, owners: nil) + previous_owner = previous_owner_for(owner, analysis, owners: owners) + return false unless previous_owner + + previous_trailing_region = trailing_region_for(previous_owner, analysis, owners: owners) + regions_equivalent?(previous_trailing_region, source_region) + end + + def previous_owner_for(owner, analysis, owners: nil) + owner_list = Array(owners || analysis&.statements).select do |entry| + owner_start_line(entry) + end + index = owner_list.index(owner) + return unless index && index.positive? + + owner_list[index - 1] + end + + def next_owner_for(owner, analysis, owners: nil) + owner_list = Array(owners || analysis&.statements).select do |entry| + owner_start_line(entry) + end + index = owner_list.index(owner) + return unless index + + owner_list[index + 1] + end + + def regions_equivalent?(left, right) + return false unless left && right + + left.respond_to?(:normalized_content) && + right.respond_to?(:normalized_content) && + left.normalized_content == right.normalized_content + end + + def root_boundary_lines_for(kind, analysis, owners: nil, augmenter_cache: nil, fallback_to_owner_bounds: false) + boundary_owners = owners || analysis.statements + comment_only_lines = comment_only_root_boundary_lines_for(kind, analysis, owners: boundary_owners) + return comment_only_lines if comment_only_lines.any? + return [] unless analysis&.respond_to?(:comment_augmenter) + + region = root_boundary_region(kind, analysis, owners: boundary_owners, augmenter_cache: augmenter_cache) + unless region_present?(region) + return [] unless fallback_to_owner_bounds + + return owner_bound_root_boundary_lines_for(kind, analysis, owners: boundary_owners) + end + + start_line, end_line = root_boundary_range(kind, analysis, region, owners: boundary_owners) + return [] unless start_line && end_line + return [] if start_line > end_line + + (start_line..end_line).filter_map { |line_number| source_line_at(analysis, line_number) } + end + + def comment_only_root_boundary_lines_for(kind, analysis, owners: nil) + return [] unless kind == :preamble + return [] unless Array(owners || analysis.statements).empty? + return [] unless analysis.respond_to?(:lines) && analysis.lines.any? + + (1..analysis.lines.length).filter_map { |line_number| source_line_at(analysis, line_number) } + end + + def owner_bound_root_boundary_lines_for(kind, analysis, owners: nil) + owner_list = Array(owners || analysis.statements).select do |owner| + owner_start_line(owner) && owner_end_line(owner) + end + return [] if owner_list.empty? + + case kind + when :preamble + first_line = owner_list.filter_map { |owner| root_boundary_owner_start_line_for(owner, analysis) }.min + return [] unless first_line && first_line > 1 + + (1...first_line).filter_map { |line_number| source_line_at(analysis, line_number) } + when :postlude + last_line = owner_list.filter_map { |owner| owner_end_line(owner) }.max + return [] unless last_line && analysis.respond_to?(:lines) + return [] if last_line >= analysis.lines.length + + ((last_line + 1)..analysis.lines.length).filter_map { |line_number| source_line_at(analysis, line_number) } + else + [] + end + end + + def root_boundary_region(kind, analysis, owners: nil, augmenter_cache: nil) + augmenter = root_comment_augmenter_for(analysis, owners: owners, augmenter_cache: augmenter_cache) + return unless augmenter + + kind == :preamble ? augmenter.preamble_region : augmenter.postlude_region + end + + def root_comment_augmenter_for(analysis, owners: nil, augmenter_cache: nil) + cache = augmenter_cache || (@root_comment_augmenters ||= {}) + key = [analysis.object_id, Array(owners || analysis.statements).map(&:object_id)] + cache[key] ||= analysis.comment_augmenter(owners: owners || analysis.statements) + end + + def root_boundary_range(kind, analysis, region, owners: nil) + owner_list = Array(owners || analysis.statements).select do |owner| + owner_start_line(owner) && owner_end_line(owner) + end + + case kind + when :preamble + end_line = if owner_list.any? + owner_list.filter_map do |owner| + root_boundary_owner_start_line_for(owner, analysis) + end.min.to_i - 1 + else + analysis.lines.length + end + [1, end_line] + when :postlude + start_line = if owner_list.any? + owner_list.filter_map { |owner| owner_end_line(owner) }.max.to_i + 1 + else + region.start_line || 1 + end + [start_line, analysis.lines.length] + end + end + + def first_owner_for(analysis, owners: nil) + Array(owners || analysis&.statements) + .select { |owner| owner_start_line(owner) } + .min_by { |owner| owner_start_line(owner) } + end + + def owner_start_line(owner) + object_start_line(owner) + end + + def owner_end_line(owner) + object_end_line(owner) + end + + def root_boundary_owner_start_line_for(owner, _analysis) + owner_start_line(owner) + end + + def region_lines_for(region) + return [] unless region_present?(region) + return region.text.split("\n") if region.respond_to?(:text) + + Array(region.nodes).filter_map do |node| + if node.respond_to?(:slice) + node.slice.to_s + elsif node.respond_to?(:text) + node.text.to_s + else + node.to_s + end + end + end + + def region_line_numbers_for(region) + return [] unless region_present?(region) + + start_line = region_start_line(region) + end_line = region_end_line(region) + return [] unless start_line && end_line + + (start_line..end_line).to_a + end + end + end +end diff --git a/gems/ast-merge/lib/ast/merge/emitter_base.rb b/gems/ast-merge/lib/ast/merge/emitter_base.rb index 4f182725c..eae629d5c 100644 --- a/gems/ast-merge/lib/ast/merge/emitter_base.rb +++ b/gems/ast-merge/lib/ast/merge/emitter_base.rb @@ -234,6 +234,21 @@ def to_s content end + # Check whether every provided line is blank. + # + # @param candidate_lines [Array] Lines to classify + # @return [Boolean] + def blank_lines?(candidate_lines) + Array(candidate_lines).all? { |line| line.to_s.strip.empty? } + end + + # Check whether the current emitter output ends with a blank line. + # + # @return [Boolean] + def ends_with_blank_line? + @lines.any? && blank_lines?([@lines.last]) + end + # Clear the emitter state def clear @lines = [] diff --git a/gems/ast-merge/lib/ast/merge/layout/augmenter.rb b/gems/ast-merge/lib/ast/merge/layout/augmenter.rb index 4edad69fb..6ef0e7049 100644 --- a/gems/ast-merge/lib/ast/merge/layout/augmenter.rb +++ b/gems/ast-merge/lib/ast/merge/layout/augmenter.rb @@ -6,6 +6,8 @@ module Layout # Builds shared blank-line gap objects and per-owner attachments from source # lines plus structural owner ranges. class Augmenter + include LineRangeSupport + attr_reader :lines, :owners, :attachments_by_owner, :preamble_gap, :postlude_gap, :interstitial_gaps, :metadata class << self @@ -151,16 +153,14 @@ def validate_owner!(owner) def owner_start_line(owner) return @start_line_for.call(owner) if @start_line_for - return owner.start_line if owner.respond_to?(:start_line) - nil + object_start_line(owner) end def owner_end_line(owner) return @end_line_for.call(owner) if @end_line_for - return owner.end_line if owner.respond_to?(:end_line) - nil + object_end_line(owner) end def owner_line_reader_available?(owner, method_name, extractor) diff --git a/gems/ast-merge/lib/ast/merge/line_range_support.rb b/gems/ast-merge/lib/ast/merge/line_range_support.rb new file mode 100644 index 000000000..79dab25c9 --- /dev/null +++ b/gems/ast-merge/lib/ast/merge/line_range_support.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module Ast + module Merge + # Shared line-range helpers for parser-neutral merge code. + # + # This module intentionally stays small: it normalizes common owner location + # shapes and source line access so higher-level comment, layout, and + # structural-edit helpers do not each grow their own variant. + module LineRangeSupport + private + + def object_start_line(object) + if object.respond_to?(:start_line) + object.start_line + elsif object.respond_to?(:location) && object.location + object.location.start_line + elsif object.respond_to?(:source_position) + object.source_position&.dig(:start_line) + elsif object.respond_to?(:start_point) && object.start_point + object.start_point.row + 1 + end + end + + def object_end_line(object) + if object.respond_to?(:end_line) + object.end_line + elsif object.respond_to?(:location) && object.location + object.location.end_line + elsif object.respond_to?(:source_position) + object.source_position&.dig(:end_line) + elsif object.respond_to?(:end_point) && object.end_point + object.end_point.row + 1 + end + end + + def source_line_at(analysis, line_number) + line = analysis.line_at(line_number) + line.respond_to?(:raw) ? line.raw : line + end + end + end +end diff --git a/gems/ast-merge/lib/ast/merge/merge_result_base.rb b/gems/ast-merge/lib/ast/merge/merge_result_base.rb index 7f20eaca0..282568d74 100644 --- a/gems/ast-merge/lib/ast/merge/merge_result_base.rb +++ b/gems/ast-merge/lib/ast/merge/merge_result_base.rb @@ -147,6 +147,21 @@ def empty? @lines.empty? end + # Check whether every provided line is blank. + # + # @param candidate_lines [Array] Lines to classify + # @return [Boolean] + def blank_lines?(candidate_lines) + Array(candidate_lines).all? { |line| line.to_s.strip.empty? } + end + + # Check whether the current result ends with a blank line. + # + # @return [Boolean] + def ends_with_blank_line? + @lines.any? && blank_lines?([@lines.last]) + end + # Get the number of lines # @return [Integer] def line_count diff --git a/gems/ast-merge/lib/ast/merge/rspec/shared_examples.rb b/gems/ast-merge/lib/ast/merge/rspec/shared_examples.rb index e1b4d0aa2..80da58ed0 100644 --- a/gems/ast-merge/lib/ast/merge/rspec/shared_examples.rb +++ b/gems/ast-merge/lib/ast/merge/rspec/shared_examples.rb @@ -24,6 +24,8 @@ # - "Ast::Merge::MergerConfig" - validates merger configuration # - "Ast::Merge::Recipe::PresetContract" - validates preset loading and companion-script resolution # - "Ast::Merge::RemovalModeCompliance" - validates generic remove_template_missing_nodes behavior +# - "Ast::Merge::RecursiveRetainedBlankGapCompliance" - validates retained blank-gap preservation in recursive owner scopes +# - "Ast::Merge::RetainedBlankGapCompliance" - validates retained matched owner blank-gap preservation # - "Ast::Merge::RuntimeDebugContract" - validates runtime-aware merge_with_debug payloads # - "Ast::Merge::UnresolvedHelperContract" - validates shared unresolved helper support # - "Ast::Merge::UnresolvedReviewStateTransportContract" - validates persisted unresolved review replay and JSON-safe transport @@ -48,7 +50,9 @@ require_relative 'shared_examples/merge_result_base' require_relative 'shared_examples/merger_config' require_relative 'shared_examples/recipe_preset_contract' +require_relative 'shared_examples/recursive_retained_blank_gap_compliance' require_relative 'shared_examples/removal_mode_compliance' +require_relative 'shared_examples/retained_blank_gap_compliance' require_relative 'shared_examples/reproducible_merge' require_relative 'shared_examples/reproducible_partial_merge' require_relative 'shared_examples/runtime_debug_contract' diff --git a/gems/ast-merge/lib/ast/merge/rspec/shared_examples/recursive_retained_blank_gap_compliance.rb b/gems/ast-merge/lib/ast/merge/rspec/shared_examples/recursive_retained_blank_gap_compliance.rb new file mode 100644 index 000000000..6565b2eab --- /dev/null +++ b/gems/ast-merge/lib/ast/merge/rspec/shared_examples/recursive_retained_blank_gap_compliance.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +# Shared example for validating retained blank-line preservation in recursive +# merge scopes. +# +# Required let blocks: +# - merger_class: The SmartMerger class to use +# - recursive_retained_blank_gap_case: Hash with :template, :destination, +# :expected, and optional :options. +# +# Optional let blocks: +# - unsupported_recursive_retained_blank_gap_reason: Reason string for formats +# that expose the shared contract but do not support recursive owner scopes. +RSpec.shared_examples('Ast::Merge::RecursiveRetainedBlankGapCompliance') do + def merge_recursive_retained_blank_gap_case(example_case, destination_override: nil) + merger_class.new( + example_case.fetch(:template), + destination_override || example_case.fetch(:destination), + **example_case.fetch(:options, {}) + ).merge.to_s + end + + it 'preserves retained blank gaps inside recursive owner scopes' do + if respond_to?(:unsupported_recursive_retained_blank_gap_reason) + skip unsupported_recursive_retained_blank_gap_reason + end + + example_case = recursive_retained_blank_gap_case + + expect(merge_recursive_retained_blank_gap_case(example_case)).to(eq(example_case.fetch(:expected))) + end + + it 'preserves retained blank gaps inside recursive owner scopes idempotently' do + if respond_to?(:unsupported_recursive_retained_blank_gap_reason) + skip unsupported_recursive_retained_blank_gap_reason + end + + example_case = recursive_retained_blank_gap_case + first_result = merge_recursive_retained_blank_gap_case(example_case) + + expect(merge_recursive_retained_blank_gap_case(example_case, + destination_override: first_result)).to(eq(first_result)) + end +end diff --git a/gems/ast-merge/lib/ast/merge/rspec/shared_examples/retained_blank_gap_compliance.rb b/gems/ast-merge/lib/ast/merge/rspec/shared_examples/retained_blank_gap_compliance.rb new file mode 100644 index 000000000..27704e28f --- /dev/null +++ b/gems/ast-merge/lib/ast/merge/rspec/shared_examples/retained_blank_gap_compliance.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +RSpec.shared_examples('Ast::Merge::RetainedBlankGapCompliance') do + def retained_blank_gap_source(*lines) + comment_matrix_source_builder.call(*lines) + end + + it 'preserves destination blank gaps between retained matched owners' do + template = retained_blank_gap_source( + comment_matrix_line_builder.call('alpha', '1'), + comment_matrix_line_builder.call('beta', '2') + ) + destination = retained_blank_gap_source( + comment_matrix_line_builder.call('alpha', '9'), + '', + comment_matrix_line_builder.call('beta', '8') + ) + + result = comment_matrix_merger_class.new(template, destination).merge + + expect(result).to(eq(destination)) + end + + it 'preserves destination blank gaps between retained matched owners under template preference' do + template = retained_blank_gap_source( + comment_matrix_line_builder.call('alpha', '1'), + comment_matrix_line_builder.call('beta', '2') + ) + destination = retained_blank_gap_source( + comment_matrix_line_builder.call('alpha', '9'), + '', + comment_matrix_line_builder.call('beta', '8') + ) + expected = retained_blank_gap_source( + comment_matrix_line_builder.call('alpha', '1'), + '', + comment_matrix_line_builder.call('beta', '2') + ) + + result = comment_matrix_merger_class.new(template, destination, preference: :template).merge + + expect(result).to(eq(expected)) + end +end diff --git a/gems/ast-merge/lib/ast/merge/smart_merger_base.rb b/gems/ast-merge/lib/ast/merge/smart_merger_base.rb index 26e5bc3df..1507efb55 100644 --- a/gems/ast-merge/lib/ast/merge/smart_merger_base.rb +++ b/gems/ast-merge/lib/ast/merge/smart_merger_base.rb @@ -68,7 +68,7 @@ module Merge # # @example FileAnalysis error handling # def parse_content - # parser = TreeHaver.parser_for(:myformat, library_path: @parser_path) + # parser = TreeHaver.parser_for(:myformat, backend_type: :tree_sitter) # @ast = parser.parse(@source) # # if @ast&.root_node&.has_error? diff --git a/gems/ast-merge/lib/ast/merge/source_region_report_support.rb b/gems/ast-merge/lib/ast/merge/source_region_report_support.rb new file mode 100644 index 000000000..7e47d795f --- /dev/null +++ b/gems/ast-merge/lib/ast/merge/source_region_report_support.rb @@ -0,0 +1,243 @@ +# frozen_string_literal: true + +module Ast + module Merge + # Parser-neutral helpers for report-style source-region ownership views. + # + # Format gems still provide owner discovery and comment syntax. These helpers + # turn those inputs into stable fixture/report data without each substrate + # reimplementing attachment and blank-region ownership rules. + module SourceRegionReportSupport + private + + def source_comment_block_attachment_report(lines:, owners:, comment_line:, owner_address: nil, + owner_start_index: nil, owner_end_index: nil, + owner_declaration_start_index: nil) + owner_address ||= ->(owner) { owner_address_for_report(owner) } + owner_start_index ||= ->(owner) { owner_index_for_report(owner, :start_index) } + owner_end_index ||= ->(owner) { owner_index_for_report(owner, :end_index) } + owner_declaration_start_index ||= lambda do |owner| + owner_index_for_report(owner, :declaration_start_index) || owner_start_index.call(owner) + end + + comment_blocks = source_comment_blocks_for_report(lines, comment_line) + { + comments: comment_blocks.map do |block| + source_comment_block_attachment( + lines: lines, + owners: owners, + block: block, + owner_address: owner_address, + owner_end_index: owner_end_index, + owner_declaration_start_index: owner_declaration_start_index + ) + end + } + end + + def source_blank_line_ownership_regions(regions:, blank_content: nil, compact: nil) + blank_content ||= ->(content) { content.to_s.lines.all? { |line| line.strip.empty? } } + compact ||= ->(region) { region.reject { |_key, value| value.nil? } } + + regions.flat_map do |region| + child_regions = if region[:child_regions] + source_blank_line_ownership_regions(regions: region[:child_regions], + blank_content: blank_content, + compact: compact) + else + [] + end + current = if region[:region_kind] == 'interstitial' && blank_content.call(region[:content]) + [ + compact.call( + region_id: region[:region_id], + position: region[:position], + previous_owner: region[:previous_owner], + next_owner: region[:next_owner], + span: region[:span], + ownership: 'declared_interstitial_region' + ) + ] + else + [] + end + + current + child_regions + end + end + + def source_interleaved_regions_for_report(lines:, owners:, container_name: nil, container_start_index: 0, + container_end_index: nil) + container_end_index ||= lines.length - 1 + regions = [] + cursor = container_start_index + previous_owner = nil + + owners.each do |owner| + owner_start = owner_index_for_report(owner, :start_index) + owner_end = owner_index_for_report(owner, :end_index) + if cursor < owner_start + regions << source_interstitial_region_for_report( + lines: lines, + start_index: cursor, + end_index: owner_start - 1, + previous_owner: previous_owner, + next_owner: owner, + container_name: container_name + ) + end + + regions << source_public_region_for_report(owner) + previous_owner = owner + cursor = owner_end + 1 + end + + if cursor <= container_end_index + regions << source_interstitial_region_for_report( + lines: lines, + start_index: cursor, + end_index: container_end_index, + previous_owner: previous_owner, + next_owner: nil, + container_name: container_name + ) + end + + regions + end + + def source_interstitial_region_for_report(lines:, start_index:, end_index:, previous_owner:, next_owner:, + container_name: nil) + position = if previous_owner.nil? && next_owner + container_name ? 'container_header' : 'file_header' + elsif previous_owner && next_owner + 'between' + elsif container_name + 'container_footer' + else + 'file_footer' + end + + region_id = case position + when 'container_header' + "class_header:#{container_name}" + when 'container_footer' + "class_footer:#{container_name}" + when 'file_header' + 'file_header' + when 'file_footer' + 'file_footer' + else + previous_id = owner_index_for_report(previous_owner, :region_id) + next_id = owner_index_for_report(next_owner, :region_id) + "between:#{previous_id}:#{next_id}" + end + + source_report_compact_region( + region_id: region_id, + region_kind: 'interstitial', + position: position, + previous_owner: owner_address_for_report(previous_owner), + next_owner: owner_address_for_report(next_owner), + span: source_report_line_span(start_index, end_index), + content: source_report_region_content(lines, start_index, end_index) + ) + end + + def source_public_region_for_report(region) + if region.respond_to?(:reject) + region.reject { |key, _value| %i[start_index declaration_start_index end_index].include?(key) } + else + region + end + end + + def source_attached_comment_regions_for_report(lines:, start_index:, declaration_index:) + return [] unless start_index < declaration_index + + [ + { + attachment: 'leading', + start_line: start_index + 1, + end_line: declaration_index, + content: source_report_region_content(lines, start_index, declaration_index - 1) + } + ] + end + + def source_comment_blocks_for_report(lines, comment_line) + blocks = [] + index = 0 + while index < lines.length + unless comment_line.call(lines[index]) + index += 1 + next + end + + start_index = index + index += 1 while index < lines.length && comment_line.call(lines[index]) + blocks << { start_index: start_index, end_index: index - 1 } + end + blocks + end + + def source_comment_block_attachment(lines:, owners:, block:, owner_address:, owner_end_index:, + owner_declaration_start_index:) + previous_owner = owners.reverse.find { |owner| owner_end_index.call(owner) < block[:start_index] } + next_owner = owners.find { |owner| owner_declaration_start_index.call(owner) > block[:end_index] } + next_owner_index = next_owner && owner_declaration_start_index.call(next_owner) + + attachment = if next_owner_index && block[:end_index] + 1 == next_owner_index + 'following_owner' + elsif previous_owner && next_owner_index && (block[:end_index] + 1...next_owner_index).any? do |idx| + lines[idx].to_s.strip.empty? + end + 'preceding_owner' + elsif previous_owner && next_owner.nil? + 'preceding_owner' + else + 'standalone' + end + + source_report_compact_region( + attachment: attachment, + previous_owner: previous_owner && owner_address.call(previous_owner), + next_owner: next_owner && owner_address.call(next_owner), + span: source_report_line_span(block[:start_index], block[:end_index]), + content: source_report_region_content(lines, block[:start_index], block[:end_index]) + ) + end + + def source_report_line_span(start_index, end_index) + { + start_line: start_index + 1, + end_line: end_index + 1 + } + end + + def source_report_region_content(lines, start_index, end_index) + "#{lines[start_index..end_index].join("\n")}\n" + end + + def source_report_compact_region(region) + region.reject { |_key, value| value.nil? } + end + + def owner_index_for_report(owner, key) + if owner.respond_to?(:[]) + owner[key] + elsif owner.respond_to?(key) + owner.public_send(key) + end + end + + def owner_address_for_report(owner) + if owner.respond_to?(:[]) + owner[:address] + elsif owner.respond_to?(:address) + owner.address + end + end + end + end +end diff --git a/gems/ast-merge/lib/ast/merge/structural_edit/boundary_support.rb b/gems/ast-merge/lib/ast/merge/structural_edit/boundary_support.rb index 10e1b0a31..d898b06b8 100644 --- a/gems/ast-merge/lib/ast/merge/structural_edit/boundary_support.rb +++ b/gems/ast-merge/lib/ast/merge/structural_edit/boundary_support.rb @@ -12,6 +12,7 @@ module StructuralEdit # (`start_line` / `end_line` or `source_position`). module BoundarySupport extend self + include LineRangeSupport # Build a boundary descriptor for a surviving statement adjacent to a splice. # @@ -67,11 +68,7 @@ def attachment_preserves_fragments?(attachment) # @param statement [Object] # @return [Integer, nil] def statement_start_line(statement) - if statement.respond_to?(:start_line) - statement.start_line - elsif statement.respond_to?(:source_position) - statement.source_position&.dig(:start_line) - end + object_start_line(statement) end # Return the ending line for a statement-like object. @@ -79,11 +76,7 @@ def statement_start_line(statement) # @param statement [Object] # @return [Integer, nil] def statement_end_line(statement) - if statement.respond_to?(:end_line) - statement.end_line - elsif statement.respond_to?(:source_position) - statement.source_position&.dig(:end_line) - end + object_end_line(statement) end private diff --git a/gems/ast-merge/spec/ast/merge/comment_layout_emission_support_spec.rb b/gems/ast-merge/spec/ast/merge/comment_layout_emission_support_spec.rb new file mode 100644 index 000000000..aebbca1ed --- /dev/null +++ b/gems/ast-merge/spec/ast/merge/comment_layout_emission_support_spec.rb @@ -0,0 +1,224 @@ +# frozen_string_literal: true + +RSpec.describe Ast::Merge::CommentLayoutEmissionSupport do + Statement = Struct.new(:name, :start_line, :end_line, keyword_init: true) + + Region = Struct.new(:start_line, :end_line, :normalized_content, keyword_init: true) do + def empty? + false + end + + def text + normalized_content + end + end + + Attachment = Struct.new(:leading_region, :trailing_region, :trailing_gap, keyword_init: true) + + class Analysis + attr_reader :lines, :statements, :comment_nodes + + def initialize(lines:, statements:, attachments: {}, preamble_region: nil, postlude_region: nil, + comment_nodes: []) + @lines = lines + @statements = statements + @attachments = attachments + @preamble_region = preamble_region + @postlude_region = postlude_region + @comment_nodes = comment_nodes + end + + def line_at(line_number) + lines[line_number - 1] + end + + def comment_attachment_for(owner, **) + @attachments.fetch(owner) { Attachment.new } + end + + def comment_augmenter(owners: nil) + Struct.new(:preamble_region, :postlude_region).new(@preamble_region, @postlude_region) + end + end + + class Harness + include Ast::Merge::CommentLayoutEmissionSupport + + public :blank_line_count_before, + :leading_region_for, + :leading_segment_line_numbers_for, + :leading_segment_lines_for, + :leading_segment_start_for_output, + :previous_owner_for, + :previous_owner_trailing_region_matches?, + :removed_owner_preserved_line_numbers_for, + :removed_owner_preserved_lines_for, + :retained_owner_leading_gap_lines_for, + :region_present?, + :root_boundary_lines_for + end + + class EmittedSegmentHarness < Harness + private + + def root_boundary_owner_start_line_for(owner, _analysis) + owner.start_line - 1 + end + end + + subject(:harness) { Harness.new } + + it 'counts blank lines immediately before an attached region' do + analysis = Analysis.new(lines: ['alpha', '', '', '# comment', 'beta'], statements: []) + + expect(harness.blank_line_count_before(4, analysis)).to eq(2) + end + + it 'keeps a source leading segment from duplicating the previous owner trailing region' do + first = Statement.new(name: 'first', start_line: 1, end_line: 1) + second = Statement.new(name: 'second', start_line: 4, end_line: 4) + shared_region = Region.new(start_line: 3, end_line: 3, normalized_content: 'shared') + analysis = Analysis.new( + lines: ['first', '', '# shared', 'second'], + statements: [first, second], + attachments: { + first => Attachment.new(trailing_region: shared_region), + second => Attachment.new + } + ) + + expect( + harness.leading_segment_start_for_output( + output_owner: second, + output_analysis: analysis, + source_region_start: 3, + source_region: shared_region, + source_analysis: analysis + ) + ).to eq(3) + end + + it 'collects preserved removed-owner leading, inline, trailing, and fallback gap lines' do + owner = Statement.new(name: 'removed', start_line: 3, end_line: 3) + later_owner = Statement.new(name: 'later', start_line: 6, end_line: 6) + gap = Ast::Merge::Layout::Gap.new( + kind: :interstitial, + start_line: 5, + end_line: 5, + lines: [''], + before_owner: owner, + after_owner: later_owner + ) + analysis = Analysis.new( + lines: ['# docs', '', 'removed', '# trailing', '', 'later'], + statements: [owner, later_owner], + attachments: { + owner => Attachment.new( + leading_region: Region.new(start_line: 1, end_line: 1, normalized_content: '# docs'), + trailing_region: Region.new(start_line: 4, end_line: 4, normalized_content: '# trailing'), + trailing_gap: gap + ) + } + ) + + expect( + harness.removed_owner_preserved_lines_for(owner, analysis, inline_lines: ['# inline']) + ).to eq(['# docs', '', '# inline', '# trailing', '']) + expect( + harness.removed_owner_preserved_line_numbers_for(owner, analysis, inline_line_numbers: [3]) + ).to eq([1, 2, 3, 4, 5]) + end + + it 'returns retained owner leading layout gaps only when no leading comment region owns the prefix' do + first = Statement.new(name: 'first', start_line: 1, end_line: 1) + second = Statement.new(name: 'second', start_line: 3, end_line: 3) + gap = Ast::Merge::Layout::Gap.new( + kind: :interstitial, + start_line: 2, + end_line: 2, + lines: [''], + before_owner: first, + after_owner: second + ) + analysis = Analysis.new( + lines: ['first', '', 'second'], + statements: [first, second], + attachments: { + second => Attachment.new + } + ) + + def analysis.layout_attachment_for(owner) + return Ast::Merge::Layout::Attachment.new(owner: owner, leading_gap: @gap) if owner.name == 'second' + + Ast::Merge::Layout::Attachment.new(owner: owner) + end + analysis.instance_variable_set(:@gap, gap) + + expect(harness.retained_owner_leading_gap_lines_for(second, analysis)).to eq(['']) + + analysis_with_comment = Analysis.new( + lines: ['first', '', '# docs', 'second'], + statements: [first, second], + attachments: { + second => Attachment.new(leading_region: Region.new(start_line: 3, end_line: 3, normalized_content: '# docs')) + } + ) + def analysis_with_comment.layout_attachment_for(owner) + return Ast::Merge::Layout::Attachment.new(owner: owner, leading_gap: @gap) if owner.name == 'second' + + Ast::Merge::Layout::Attachment.new(owner: owner) + end + analysis_with_comment.instance_variable_set(:@gap, gap) + + expect(harness.retained_owner_leading_gap_lines_for(second, analysis_with_comment)).to eq([]) + end + + it 'returns root preamble lines using root comment attachment regions' do + statement = Statement.new(name: 'body', start_line: 4, end_line: 4) + analysis = Analysis.new( + lines: ['# header', '', '# docs', 'body'], + statements: [statement], + preamble_region: Region.new(start_line: 1, end_line: 3, normalized_content: 'header docs') + ) + + expect(harness.root_boundary_lines_for(:preamble, analysis)).to eq(['# header', '', '# docs']) + end + + it 'treats comment-only files as root preamble lines' do + analysis = Analysis.new( + lines: ['# only', '', '# comments'], + statements: [], + comment_nodes: [] + ) + + expect(harness.root_boundary_lines_for(:preamble, analysis)).to eq(['# only', '', '# comments']) + end + + it 'can fall back to owner bounds for non-comment root boundary text' do + statement = Statement.new(name: 'body', start_line: 3, end_line: 3) + analysis = Analysis.new( + lines: ['#!/usr/bin/env bash', '# header', 'body', '# footer'], + statements: [statement] + ) + + expect( + harness.root_boundary_lines_for(:preamble, analysis, fallback_to_owner_bounds: true) + ).to eq(['#!/usr/bin/env bash', '# header']) + expect( + harness.root_boundary_lines_for(:postlude, analysis, fallback_to_owner_bounds: true) + ).to eq(['# footer']) + end + + it 'lets substrates bound root preamble by the emitted owner segment' do + statement = Statement.new(name: 'body', start_line: 3, end_line: 3) + analysis = Analysis.new( + lines: ['#!/usr/bin/env bash', '# header', 'body'], + statements: [statement] + ) + + expect( + EmittedSegmentHarness.new.root_boundary_lines_for(:preamble, analysis, fallback_to_owner_bounds: true) + ).to eq(['#!/usr/bin/env bash']) + end +end diff --git a/gems/ast-merge/spec/ast/merge/emitter_base_spec.rb b/gems/ast-merge/spec/ast/merge/emitter_base_spec.rb index 53ebcfe37..d2277a1cf 100644 --- a/gems/ast-merge/spec/ast/merge/emitter_base_spec.rb +++ b/gems/ast-merge/spec/ast/merge/emitter_base_spec.rb @@ -27,6 +27,32 @@ def emit_comment(text, inline: false) let(:owner) { LayoutOwner.new(start_line: 3, end_line: 3, label: :owner) } let(:after_owner) { LayoutOwner.new(start_line: 4, end_line: 4, label: :after) } + describe '#blank_lines?' do + it 'returns true when every provided line is blank' do + expect(emitter.blank_lines?(['', ' '])).to be(true) + end + + it 'returns false when any provided line has content' do + expect(emitter.blank_lines?(['', 'value'])).to be(false) + end + end + + describe '#ends_with_blank_line?' do + it 'returns true when the output ends with a blank line' do + emitter.emit_raw_lines(['value', '']) + + expect(emitter.ends_with_blank_line?).to be(true) + end + + it 'returns false when the output is empty or ends with content' do + expect(emitter.ends_with_blank_line?).to be(false) + + emitter.emit_raw_lines(['value']) + + expect(emitter.ends_with_blank_line?).to be(false) + end + end + describe '#emit_comment_region' do it 'emits full-line regions and preserves blank gaps from source lines' do region = Ast::Merge::Comment::TrackedHashAdapter.region( diff --git a/gems/ast-merge/spec/ast/merge/line_range_support_spec.rb b/gems/ast-merge/spec/ast/merge/line_range_support_spec.rb new file mode 100644 index 000000000..52c55cb54 --- /dev/null +++ b/gems/ast-merge/spec/ast/merge/line_range_support_spec.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +RSpec.describe Ast::Merge::LineRangeSupport do + Location = Struct.new(:start_line, :end_line, keyword_init: true) + Point = Struct.new(:row, keyword_init: true) + + class LineRangeHarness + include Ast::Merge::LineRangeSupport + + public :object_start_line, :object_end_line, :source_line_at + end + + subject(:harness) { LineRangeHarness.new } + + it 'reads explicit line ranges' do + object = Struct.new(:start_line, :end_line).new(3, 5) + + expect(harness.object_start_line(object)).to eq(3) + expect(harness.object_end_line(object)).to eq(5) + end + + it 'reads location line ranges' do + object = Struct.new(:location).new(Location.new(start_line: 7, end_line: 9)) + + expect(harness.object_start_line(object)).to eq(7) + expect(harness.object_end_line(object)).to eq(9) + end + + it 'reads source_position line ranges' do + object = Struct.new(:source_position).new({ start_line: 11, end_line: 13 }) + + expect(harness.object_start_line(object)).to eq(11) + expect(harness.object_end_line(object)).to eq(13) + end + + it 'reads tree-sitter point line ranges' do + object = Struct.new(:start_point, :end_point).new(Point.new(row: 16), Point.new(row: 18)) + + expect(harness.object_start_line(object)).to eq(17) + expect(harness.object_end_line(object)).to eq(19) + end + + it 'normalizes raw line objects' do + analysis = Struct.new(:lines) do + def line_at(line_number) + lines[line_number - 1] + end + end.new([Struct.new(:raw).new('raw line')]) + + expect(harness.source_line_at(analysis, 1)).to eq('raw line') + end +end diff --git a/gems/ast-merge/spec/ast/merge/merge_result_base_spec.rb b/gems/ast-merge/spec/ast/merge/merge_result_base_spec.rb index ea30705e7..eca3f4fb3 100644 --- a/gems/ast-merge/spec/ast/merge/merge_result_base_spec.rb +++ b/gems/ast-merge/spec/ast/merge/merge_result_base_spec.rb @@ -238,6 +238,39 @@ end end + describe '#blank_lines?' do + it 'returns true when every provided line is blank' do + result = described_class.new + + expect(result.blank_lines?(['', " \t"])).to be(true) + end + + it 'returns false when any provided line has content' do + result = described_class.new + + expect(result.blank_lines?(['', 'content'])).to be(false) + end + end + + describe '#ends_with_blank_line?' do + it 'returns true when the current result ends with a blank line' do + result = described_class.new + result.lines.concat(['content', '']) + + expect(result.ends_with_blank_line?).to be(true) + end + + it 'returns false when the current result is empty or ends with content' do + result = described_class.new + + expect(result.ends_with_blank_line?).to be(false) + + result.lines << 'content' + + expect(result.ends_with_blank_line?).to be(false) + end + end + describe '#line_count' do it 'returns 0 for empty result' do result = described_class.new diff --git a/gems/ast-merge/spec/ast/merge/source_region_report_support_spec.rb b/gems/ast-merge/spec/ast/merge/source_region_report_support_spec.rb new file mode 100644 index 000000000..8d4946d3d --- /dev/null +++ b/gems/ast-merge/spec/ast/merge/source_region_report_support_spec.rb @@ -0,0 +1,200 @@ +# frozen_string_literal: true + +RSpec.describe Ast::Merge::SourceRegionReportSupport do + Owner = Struct.new(:region_id, :address, :start_index, :declaration_start_index, :end_index, keyword_init: true) + + class SourceRegionReportHarness + include Ast::Merge::SourceRegionReportSupport + + public :source_blank_line_ownership_regions, + :source_comment_block_attachment_report, + :source_interleaved_regions_for_report, + :source_attached_comment_regions_for_report + end + + subject(:harness) { SourceRegionReportHarness.new } + + it 'reports comment block attachment against already-discovered owners' do + lines = [ + '# file note', + '', + 'def alpha', + 'end', + '', + '# beta docs', + 'def beta', + 'end', + '# beta tail', + '', + 'def gamma', + 'end' + ] + owners = [ + Owner.new(address: '/methods/alpha', start_index: 2, declaration_start_index: 2, end_index: 3), + Owner.new(address: '/methods/beta', start_index: 5, declaration_start_index: 6, end_index: 7), + Owner.new(address: '/methods/gamma', start_index: 10, declaration_start_index: 10, end_index: 11) + ] + + expect( + harness.source_comment_block_attachment_report( + lines: lines, + owners: owners, + comment_line: ->(line) { line.start_with?('#') } + ) + ).to eq( + comments: [ + { + attachment: 'standalone', + next_owner: '/methods/alpha', + span: { start_line: 1, end_line: 1 }, + content: "# file note\n" + }, + { + attachment: 'following_owner', + previous_owner: '/methods/alpha', + next_owner: '/methods/beta', + span: { start_line: 6, end_line: 6 }, + content: "# beta docs\n" + }, + { + attachment: 'preceding_owner', + previous_owner: '/methods/beta', + next_owner: '/methods/gamma', + span: { start_line: 9, end_line: 9 }, + content: "# beta tail\n" + } + ] + ) + end + + it 'interleaves public owner regions with shared interstitial report regions' do + lines = [ + '# file note', + '', + 'def alpha', + 'end', + '', + 'def beta', + 'end' + ] + owners = [ + { + region_id: 'method:alpha', + region_kind: 'owner', + address: '/methods/alpha', + start_index: 2, + declaration_start_index: 2, + end_index: 3, + span: { start_line: 3, end_line: 4 }, + content: "def alpha\nend\n" + }, + { + region_id: 'method:beta', + region_kind: 'owner', + address: '/methods/beta', + start_index: 5, + declaration_start_index: 5, + end_index: 6, + span: { start_line: 6, end_line: 7 }, + content: "def beta\nend\n" + } + ] + + expect(harness.source_interleaved_regions_for_report(lines: lines, owners: owners)).to eq( + [ + { + region_id: 'file_header', + region_kind: 'interstitial', + position: 'file_header', + next_owner: '/methods/alpha', + span: { start_line: 1, end_line: 2 }, + content: "# file note\n\n" + }, + { + region_id: 'method:alpha', + region_kind: 'owner', + address: '/methods/alpha', + span: { start_line: 3, end_line: 4 }, + content: "def alpha\nend\n" + }, + { + region_id: 'between:method:alpha:method:beta', + region_kind: 'interstitial', + position: 'between', + previous_owner: '/methods/alpha', + next_owner: '/methods/beta', + span: { start_line: 5, end_line: 5 }, + content: "\n" + }, + { + region_id: 'method:beta', + region_kind: 'owner', + address: '/methods/beta', + span: { start_line: 6, end_line: 7 }, + content: "def beta\nend\n" + } + ] + ) + end + + it 'reports attached leading comment regions using the Ruby source-region contract shape' do + expect( + harness.source_attached_comment_regions_for_report( + lines: ['# docs', 'def alpha'], + start_index: 0, + declaration_index: 1 + ) + ).to eq( + [ + { + attachment: 'leading', + start_line: 1, + end_line: 1, + content: "# docs\n" + } + ] + ) + end + + it 'extracts blank interstitial ownership recursively' do + regions = [ + { + region_id: 'outer', + region_kind: 'owner', + child_regions: [ + { + region_id: 'between:a:b', + region_kind: 'interstitial', + position: 'between', + previous_owner: '/a', + next_owner: '/b', + span: { start_line: 3, end_line: 4 }, + content: "\n\n" + }, + { + region_id: 'comment-gap', + region_kind: 'interstitial', + position: 'between', + previous_owner: '/b', + next_owner: '/c', + span: { start_line: 8, end_line: 8 }, + content: "# comment\n" + } + ] + } + ] + + expect(harness.source_blank_line_ownership_regions(regions: regions)).to eq( + [ + { + region_id: 'between:a:b', + position: 'between', + previous_owner: '/a', + next_owner: '/b', + span: { start_line: 3, end_line: 4 }, + ownership: 'declared_interstitial_region' + } + ] + ) + end +end diff --git a/gems/ast-merge/spec/fixtures_integration_spec.rb b/gems/ast-merge/spec/fixtures_integration_spec.rb index b7da63ae6..c20fe43cb 100644 --- a/gems/ast-merge/spec/fixtures_integration_spec.rb +++ b/gems/ast-merge/spec/fixtures_integration_spec.rb @@ -1750,11 +1750,15 @@ def add_fixture_line(content, decision:, source:, line:) ) argument_counts = suite.cases.map(&:argument_count) structured_diff_count = suite.cases.count { |smoke_case| smoke_case.expected_output_kind == 'structured_diff' } + reviewable_output_case_count = suite.cases.count { |smoke_case| smoke_case.expected_output_fragments.any? } + real_source_pair_count = raw.fetch(:real_source_pairs).length expect(suite.driver_name).to eq(fixture.dig(:expected, :driver_name)) expect(suite.cases.length).to eq(fixture.dig(:expected, :case_count)) expect(argument_counts).to eq(fixture.dig(:expected, :argument_counts)) expect(structured_diff_count).to eq(fixture.dig(:expected, :structured_diff_count)) + expect(reviewable_output_case_count).to eq(fixture.dig(:expected, :reviewable_output_case_count)) + expect(real_source_pair_count).to eq(fixture.dig(:expected, :real_source_pair_count)) end it 'conforms to the slice-904 performance guardrails fixture' do diff --git a/gems/ast-merge/spec/spec_helper.rb b/gems/ast-merge/spec/spec_helper.rb index f8c5b2f52..eb1762057 100644 --- a/gems/ast-merge/spec/spec_helper.rb +++ b/gems/ast-merge/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/ast-template/.kettle-drift.lock b/gems/ast-template/.kettle-drift.lock deleted file mode 100644 index aa01ca527..000000000 --- a/gems/ast-template/.kettle-drift.lock +++ /dev/null @@ -1,317 +0,0 @@ -{ - "(direct_sibling_local ||\nENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)": [ - { - "file": "Gemfile", - "lines": [ - 79, - 119, - 159, - 199, - 239, - 279, - 319, - 359 - ] - } - ], - ".find { |spec| spec.name == 'nomono' }\nnomono_locked = nomono_locked_spec &&": [ - { - "file": "Gemfile", - "lines": [ - 90, - 130, - 170, - 210, - 250, - 290, - 330, - 370 - ] - } - ], - "ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)\ndirect_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')": [ - { - "file": "Gemfile", - "lines": [ - 80, - 120, - 160, - 200, - 240, - 280, - 320, - 360 - ] - } - ], - "Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)\nnomono_activation_requirements = [\"= #{nomono_locked_spec.version}\"] if nomono_locked": [ - { - "file": "Gemfile", - "lines": [ - 92, - 132, - 172, - 212, - 252, - 292, - 332, - 372 - ] - } - ], - "Kernel.send(:gem, 'nomono', *nomono_activation_requirements)\nrequire 'nomono/bundler'": [ - { - "file": "Gemfile", - "lines": [ - 95, - 135, - 175, - 215, - 255, - 295, - 335, - 375 - ] - } - ], - "direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')\ndirect_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)": [ - { - "file": "Gemfile", - "lines": [ - 81, - 121, - 161, - 201, - 241, - 281, - 321, - 361 - ] - } - ], - "eval_nomono_gems(\ngems: direct_sibling_gems,": [ - { - "file": "Gemfile", - "lines": [ - 59, - 99, - 139, - 179, - 219, - 259, - 299, - 339, - 379 - ] - } - ], - "gems: direct_sibling_gems,\nprefix: 'STRUCTUREDMERGE',": [ - { - "file": "Gemfile", - "lines": [ - 100, - 140, - 180, - 220, - 260, - 300, - 340, - 380 - ] - } - ], - "if File.file?(nomono_lockfile)\nnomono_locked_spec = Bundler::LockfileParser": [ - { - "file": "Gemfile", - "lines": [ - 42, - 86, - 126, - 166, - 206, - 246, - 286, - 326, - 366 - ] - } - ], - "if direct_sibling_dev_was_set\nENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original": [ - { - "file": "Gemfile", - "lines": [ - 109, - 149, - 189, - 229, - 269, - 309, - 349, - 389 - ] - } - ], - "if direct_sibling_gems.any? &&\n(direct_sibling_local ||": [ - { - "file": "Gemfile", - "lines": [ - 34, - 78, - 118, - 158, - 198, - 238, - 278, - 318, - 358 - ] - } - ], - "if direct_sibling_templating && !direct_sibling_local\nif direct_sibling_dev_was_set": [ - { - "file": "Gemfile", - "lines": [ - 68, - 108, - 148, - 188, - 228, - 268, - 308, - 348, - 388 - ] - } - ], - "nomono_activation_requirements = nomono_requirements\nnomono_lockfile = File.expand_path('Gemfile.lock', __dir__)": [ - { - "file": "Gemfile", - "lines": [ - 84, - 124, - 164, - 204, - 244, - 284, - 324, - 364 - ] - } - ], - "nomono_locked = nomono_locked_spec &&\nGem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)": [ - { - "file": "Gemfile", - "lines": [ - 47, - 91, - 131, - 171, - 211, - 251, - 291, - 331, - 371 - ] - } - ], - "nomono_locked_spec = Bundler::LockfileParser\n.new(Bundler.read_file(nomono_lockfile))": [ - { - "file": "Gemfile", - "lines": [ - 43, - 87, - 127, - 167, - 207, - 247, - 287, - 327, - 367 - ] - } - ], - "nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)\nif File.file?(nomono_lockfile)": [ - { - "file": "Gemfile", - "lines": [ - 85, - 125, - 165, - 205, - 245, - 285, - 325, - 365 - ] - } - ], - "path_env: 'STRUCTUREDMERGE_DEV',\nroot: %w[src my structuredmerge]": [ - { - "file": "Gemfile", - "lines": [ - 102, - 142, - 182, - 222, - 262, - 302, - 342, - 382 - ] - } - ], - "prefix: 'STRUCTUREDMERGE',\npath_env: 'STRUCTUREDMERGE_DEV',": [ - { - "file": "Gemfile", - "lines": [ - 101, - 141, - 181, - 221, - 261, - 301, - 341, - 381 - ] - } - ], - "require 'nomono/bundler'\nENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local": [ - { - "file": "Gemfile", - "lines": [ - 96, - 136, - 176, - 216, - 256, - 296, - 336, - 376 - ] - } - ], - "rescue LoadError\nwarn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'": [ - { - "file": "Gemfile", - "lines": [ - 105, - 145, - 185, - 225, - 265, - 305, - 345, - 385 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 - ] - } - ] -} diff --git a/gems/ast-template/.rubocop_gradual.lock b/gems/ast-template/.rubocop_gradual.lock index 032ac1f2a..ffe8d234a 100644 --- a/gems/ast-template/.rubocop_gradual.lock +++ b/gems/ast-template/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:3875640430": [ + ".simplecov:167186165": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:2781279821": [ @@ -21,13 +21,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -63,6 +70,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -72,10 +86,10 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], diff --git a/gems/ast-template/.simplecov b/gems/ast-template/.simplecov index 0c8c08ba7..7ca2ffaf8 100644 --- a/gems/ast-template/.simplecov +++ b/gems/ast-template/.simplecov @@ -4,15 +4,11 @@ # ast-template will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/ast-template/.structuredmerge/kettle-jem.yml b/gems/ast-template/.structuredmerge/kettle-jem.yml index 31c999402..c5dc1f1dc 100644 --- a/gems/ast-template/.structuredmerge/kettle-jem.yml +++ b/gems/ast-template/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/ast/template/version.rb - source: sig/gem.rbs diff --git a/gems/ast-template/Gemfile b/gems/ast-template/Gemfile index 3c92e5d7c..69a634498 100644 --- a/gems/ast-template/Gemfile +++ b/gems/ast-template/Gemfile @@ -36,300 +36,8 @@ if direct_sibling_gems.any? && ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) + require 'nomono/bundler' begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( @@ -338,8 +46,6 @@ if direct_sibling_gems.any? && path_env: 'STRUCTUREDMERGE_DEV', root: %w[src my structuredmerge] ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -351,62 +57,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -414,7 +66,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/ast-template/Gemfile.lock b/gems/ast-template/Gemfile.lock index b17738f92..7f7f51bfd 100644 --- a/gems/ast-template/Gemfile.lock +++ b/gems/ast-template/Gemfile.lock @@ -5,273 +5,6 @@ PATH ast-merge (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,22 +15,26 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +42,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +72,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +91,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +115,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,21 +124,10 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) mutex_m (0.3.0) - nokogiri (1.19.4-aarch64-linux-gnu) - racc (~> 1.4) - nokogiri (1.19.4-aarch64-linux-musl) - racc (~> 1.4) - nokogiri (1.19.4-arm64-darwin) - racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.19.4-x86_64-linux-musl) - racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +148,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +203,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +218,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +257,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -530,28 +278,22 @@ GEM ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) - service_actor (3.9.4) - zeitwerk (>= 1.0) silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +306,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +329,16 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +348,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -624,120 +375,77 @@ GEM zlib (3.2.3) PLATFORMS - aarch64-linux - aarch64-linux-gnu - aarch64-linux-musl - arm64-darwin - x86_64-darwin + x86_64-linux x86_64-linux-gnu - x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.0, >= 3.0.6) - ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! + appraisal2-rubocop (~> 1.0, >= 1.0.0) ast-template! - bash-merge! benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! - commonmarker-merge! + cgi (~> 0.5) debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.0) - go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.0, >= 2.2.25) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) + kettle-soup-cover (~> 3.0, >= 3.0.3) kettle-test (~> 2.0, >= 2.0.9) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) + standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.3) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + tree_sitter_language_pack (~> 1.13, >= 1.13.3) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 - ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -746,61 +454,42 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 - json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 - markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 - nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f - nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af - nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a - nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -818,35 +507,37 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) - service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -855,20 +546,16 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -876,8 +563,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/ast-template/LICENSE.md b/gems/ast-template/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/ast-template/LICENSE.md +++ b/gems/ast-template/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/ast-template/README.md b/gems/ast-template/README.md index 5d1bbc9a4..28dec4203 100644 --- a/gems/ast-template/README.md +++ b/gems/ast-template/README.md @@ -36,8 +36,8 @@ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-ta | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -149,7 +149,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -175,6 +175,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-template [⛳️namespace-img]: https://img.shields.io/badge/namespace-Ast::Template-3C2D2D.svg?style=square&logo=ruby&logoColor=white @@ -219,7 +221,7 @@ If none of the available licenses suit your use case, please [contact us](mailto [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/ast-template [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/ast-template -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/ast-template [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/ast-template/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/ast-template/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/ast-template/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/ast-template/gemfiles/modular/cgi/vHEAD.gemfile b/gems/ast-template/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/ast-template/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/ast-template/gemfiles/modular/coverage.gemfile b/gems/ast-template/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/ast-template/gemfiles/modular/coverage.gemfile +++ b/gems/ast-template/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/ast-template/gemfiles/modular/coverage_local.gemfile b/gems/ast-template/gemfiles/modular/coverage_local.gemfile index 03f58a984..0fc7ac539 100644 --- a/gems/ast-template/gemfiles/modular/coverage_local.gemfile +++ b/gems/ast-template/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[ast-template] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-template/gemfiles/modular/documentation.gemfile b/gems/ast-template/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/ast-template/gemfiles/modular/documentation.gemfile +++ b/gems/ast-template/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/ast-template/gemfiles/modular/documentation_local.gemfile b/gems/ast-template/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..54d1b71a8 100644 --- a/gems/ast-template/gemfiles/modular/documentation_local.gemfile +++ b/gems/ast-template/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-template] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/ast-template/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/ast-template/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-template/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/ast-template/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-template/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/ast-template/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/ast-template/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/ast-template/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/ast-template/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/ast-template/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/ast-template/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/ast-template/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/ast-template/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/ast-template/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/ast-template/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/ast-template/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/ast-template/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/ast-template/gemfiles/modular/optional.gemfile b/gems/ast-template/gemfiles/modular/optional.gemfile index a6e3ebc87..9ea429538 100644 --- a/gems/ast-template/gemfiles/modular/optional.gemfile +++ b/gems/ast-template/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-template templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/ast-template/gemfiles/modular/runtime_heads.gemfile b/gems/ast-template/gemfiles/modular/runtime_heads.gemfile index ee76c0095..ebf17c529 100644 --- a/gems/ast-template/gemfiles/modular/runtime_heads.gemfile +++ b/gems/ast-template/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during ast-template templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/ast-template/gemfiles/modular/style.gemfile b/gems/ast-template/gemfiles/modular/style.gemfile index 38dda7711..4dbcc02c0 100644 --- a/gems/ast-template/gemfiles/modular/style.gemfile +++ b/gems/ast-template/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during ast-template templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/ast-template/gemfiles/modular/style_local.gemfile b/gems/ast-template/gemfiles/modular/style_local.gemfile index ce75bbe21..07ab6fd23 100644 --- a/gems/ast-template/gemfiles/modular/style_local.gemfile +++ b/gems/ast-template/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[ast-template] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/ast-template/gemfiles/modular/templating.gemfile b/gems/ast-template/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/ast-template/gemfiles/modular/templating.gemfile +++ b/gems/ast-template/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/ast-template/gemfiles/modular/templating_local.gemfile b/gems/ast-template/gemfiles/modular/templating_local.gemfile index 6eb9ac7ae..7ae3fae30 100644 --- a/gems/ast-template/gemfiles/modular/templating_local.gemfile +++ b/gems/ast-template/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[ast-template] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[ast-template] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[ast-template] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/ast-template/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/ast-template/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/ast-template/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/ast-template/gemfiles/modular/webrick/vHEAD.gemfile b/gems/ast-template/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/ast-template/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/ast-template/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/ast-template/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/ast-template/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/ast-template/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/ast-template/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/ast-template/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/ast-template/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/ast-template/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/ast-template/spec/spec_helper.rb b/gems/ast-template/spec/spec_helper.rb index e230006dc..f4d1208d9 100644 --- a/gems/ast-template/spec/spec_helper.rb +++ b/gems/ast-template/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/bash-merge/.kettle-drift.lock b/gems/bash-merge/.kettle-drift.lock deleted file mode 100644 index 09df60df7..000000000 --- a/gems/bash-merge/.kettle-drift.lock +++ /dev/null @@ -1,317 +0,0 @@ -{ - "(direct_sibling_local ||\nENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)": [ - { - "file": "Gemfile", - "lines": [ - 80, - 120, - 160, - 200, - 240, - 280, - 320, - 360 - ] - } - ], - ".find { |spec| spec.name == 'nomono' }\nnomono_locked = nomono_locked_spec &&": [ - { - "file": "Gemfile", - "lines": [ - 91, - 131, - 171, - 211, - 251, - 291, - 331, - 371 - ] - } - ], - "ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)\ndirect_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')": [ - { - "file": "Gemfile", - "lines": [ - 81, - 121, - 161, - 201, - 241, - 281, - 321, - 361 - ] - } - ], - "Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)\nnomono_activation_requirements = [\"= #{nomono_locked_spec.version}\"] if nomono_locked": [ - { - "file": "Gemfile", - "lines": [ - 93, - 133, - 173, - 213, - 253, - 293, - 333, - 373 - ] - } - ], - "Kernel.send(:gem, 'nomono', *nomono_activation_requirements)\nrequire 'nomono/bundler'": [ - { - "file": "Gemfile", - "lines": [ - 96, - 136, - 176, - 216, - 256, - 296, - 336, - 376 - ] - } - ], - "direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')\ndirect_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)": [ - { - "file": "Gemfile", - "lines": [ - 82, - 122, - 162, - 202, - 242, - 282, - 322, - 362 - ] - } - ], - "eval_nomono_gems(\ngems: direct_sibling_gems,": [ - { - "file": "Gemfile", - "lines": [ - 60, - 100, - 140, - 180, - 220, - 260, - 300, - 340, - 380 - ] - } - ], - "gems: direct_sibling_gems,\nprefix: 'STRUCTUREDMERGE',": [ - { - "file": "Gemfile", - "lines": [ - 101, - 141, - 181, - 221, - 261, - 301, - 341, - 381 - ] - } - ], - "if File.file?(nomono_lockfile)\nnomono_locked_spec = Bundler::LockfileParser": [ - { - "file": "Gemfile", - "lines": [ - 43, - 87, - 127, - 167, - 207, - 247, - 287, - 327, - 367 - ] - } - ], - "if direct_sibling_dev_was_set\nENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original": [ - { - "file": "Gemfile", - "lines": [ - 110, - 150, - 190, - 230, - 270, - 310, - 350, - 390 - ] - } - ], - "if direct_sibling_gems.any? &&\n(direct_sibling_local ||": [ - { - "file": "Gemfile", - "lines": [ - 35, - 79, - 119, - 159, - 199, - 239, - 279, - 319, - 359 - ] - } - ], - "if direct_sibling_templating && !direct_sibling_local\nif direct_sibling_dev_was_set": [ - { - "file": "Gemfile", - "lines": [ - 69, - 109, - 149, - 189, - 229, - 269, - 309, - 349, - 389 - ] - } - ], - "nomono_activation_requirements = nomono_requirements\nnomono_lockfile = File.expand_path('Gemfile.lock', __dir__)": [ - { - "file": "Gemfile", - "lines": [ - 85, - 125, - 165, - 205, - 245, - 285, - 325, - 365 - ] - } - ], - "nomono_locked = nomono_locked_spec &&\nGem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)": [ - { - "file": "Gemfile", - "lines": [ - 48, - 92, - 132, - 172, - 212, - 252, - 292, - 332, - 372 - ] - } - ], - "nomono_locked_spec = Bundler::LockfileParser\n.new(Bundler.read_file(nomono_lockfile))": [ - { - "file": "Gemfile", - "lines": [ - 44, - 88, - 128, - 168, - 208, - 248, - 288, - 328, - 368 - ] - } - ], - "nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)\nif File.file?(nomono_lockfile)": [ - { - "file": "Gemfile", - "lines": [ - 86, - 126, - 166, - 206, - 246, - 286, - 326, - 366 - ] - } - ], - "path_env: 'STRUCTUREDMERGE_DEV',\nroot: %w[src my structuredmerge]": [ - { - "file": "Gemfile", - "lines": [ - 103, - 143, - 183, - 223, - 263, - 303, - 343, - 383 - ] - } - ], - "prefix: 'STRUCTUREDMERGE',\npath_env: 'STRUCTUREDMERGE_DEV',": [ - { - "file": "Gemfile", - "lines": [ - 102, - 142, - 182, - 222, - 262, - 302, - 342, - 382 - ] - } - ], - "require 'nomono/bundler'\nENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local": [ - { - "file": "Gemfile", - "lines": [ - 97, - 137, - 177, - 217, - 257, - 297, - 337, - 377 - ] - } - ], - "rescue LoadError\nwarn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'": [ - { - "file": "Gemfile", - "lines": [ - 106, - 146, - 186, - 226, - 266, - 306, - 346, - 386 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 - ] - } - ] -} diff --git a/gems/bash-merge/.rubocop_gradual.lock b/gems/bash-merge/.rubocop_gradual.lock index 69ee17f8e..2c032ec6e 100644 --- a/gems/bash-merge/.rubocop_gradual.lock +++ b/gems/bash-merge/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:3524239918": [ + ".simplecov:1611471541": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:521981965": [ @@ -8,9 +8,10 @@ [163, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 1367093088], [166, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 3881946477] ], - "bash-merge.gemspec:4057981445": [ + "bash-merge.gemspec:1539117488": [ [118, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2821357214], - [126, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 981994949] + [129, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 3888612416], + [130, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 981994949] ], "gemfiles/modular/benchmark/r4/v0.5.gemfile:3644720371": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] @@ -19,13 +20,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -61,6 +69,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -70,35 +85,36 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], "lib/bash-merge.rb:2115710001": [ [1, 1, 0, "Naming/FileName: The name of this source file (`bash-merge.rb`) should use snake_case.", 5381] ], - "lib/bash/merge.rb:4206734161": [ - [160, 7, 615, "Metrics/MethodLength: Method has too many lines. [13/10]", 1174626529] + "lib/bash/merge.rb:4271795441": [ + [167, 7, 913, "Metrics/MethodLength: Method has too many lines. [19/10]", 3225777100] ], "lib/bash/merge/comment_tracker.rb:2891158123": [ [54, 7, 773, "Metrics/MethodLength: Method has too many lines. [25/10]", 729186432] ], - "lib/bash/merge/file_analysis.rb:2458110112": [ - [13, 5, 10970, "Metrics/ClassLength: Class has too many lines. [185/100]", 582917352], - [45, 7, 1156, "Metrics/MethodLength: Method has too many lines. [16/10]", 260197263], + "lib/bash/merge/file_analysis.rb:224137169": [ + [13, 5, 11336, "Metrics/ClassLength: Class has too many lines. [194/100]", 582917352], + [45, 7, 1125, "Metrics/MethodLength: Method has too many lines. [16/10]", 3123023090], [169, 9, 6, "Naming/MemoizedInstanceVariableName: Memoized variable `@nodes` does not match method name `statements`. Use `@statements` instead.", 2756313398], [208, 7, 478, "Metrics/MethodLength: Method has too many lines. [14/10]", 3606020460], - [262, 7, 1331, "Metrics/AbcSize: Assignment Branch Condition size for `extract_freeze_blocks` is too high. [<12, 19, 11> 25.02/17]", 2209896179], - [262, 7, 1331, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `extract_freeze_blocks` is too high. [9/7]", 2209896179], - [262, 7, 1331, "Metrics/MethodLength: Method has too many lines. [27/10]", 2209896179], - [262, 7, 1331, "Metrics/PerceivedComplexity: Perceived complexity for `extract_freeze_blocks` is too high. [10/8]", 2209896179], - [303, 7, 835, "Metrics/AbcSize: Assignment Branch Condition size for `integrate_nodes_and_freeze_blocks` is too high. [<8, 21, 10> 24.6/17]", 1332923118], - [303, 7, 835, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `integrate_nodes_and_freeze_blocks` is too high. [11/7]", 1332923118], - [303, 7, 835, "Metrics/MethodLength: Method has too many lines. [14/10]", 1332923118], - [303, 7, 835, "Metrics/PerceivedComplexity: Perceived complexity for `integrate_nodes_and_freeze_blocks` is too high. [11/8]", 1332923118] + [229, 7, 1173, "Metrics/MethodLength: Method has too many lines. [18/10]", 3957755541], + [271, 7, 1331, "Metrics/AbcSize: Assignment Branch Condition size for `extract_freeze_blocks` is too high. [<12, 19, 11> 25.02/17]", 2209896179], + [271, 7, 1331, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `extract_freeze_blocks` is too high. [9/7]", 2209896179], + [271, 7, 1331, "Metrics/MethodLength: Method has too many lines. [27/10]", 2209896179], + [271, 7, 1331, "Metrics/PerceivedComplexity: Perceived complexity for `extract_freeze_blocks` is too high. [10/8]", 2209896179], + [312, 7, 835, "Metrics/AbcSize: Assignment Branch Condition size for `integrate_nodes_and_freeze_blocks` is too high. [<8, 21, 10> 24.6/17]", 1332923118], + [312, 7, 835, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `integrate_nodes_and_freeze_blocks` is too high. [11/7]", 1332923118], + [312, 7, 835, "Metrics/MethodLength: Method has too many lines. [14/10]", 1332923118], + [312, 7, 835, "Metrics/PerceivedComplexity: Perceived complexity for `integrate_nodes_and_freeze_blocks` is too high. [11/8]", 1332923118] ], "lib/bash/merge/freeze_node.rb:3178614316": [ [32, 21, 127, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 1948779238] @@ -113,44 +129,36 @@ [138, 7, 2413, "Metrics/MethodLength: Method has too many lines. [37/10]", 152834448], [210, 7, 661, "Metrics/MethodLength: Method has too many lines. [12/10]", 3160634112] ], - "lib/bash/merge/smart_merger.rb:855700947": [ - [37, 5, 30057, "Metrics/ClassLength: Class has too many lines. [557/100]", 4256794719], - [61, 7, 1020, "Metrics/MethodLength: Method has too many lines. [15/10]", 746325062], - [61, 21, 401, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [13/5]", 1661881927], - [121, 7, 1365, "Metrics/AbcSize: Assignment Branch Condition size for `merge_with_debug` is too high. [<3, 24, 7> 25.18/17]", 1535809936], - [121, 7, 1365, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `merge_with_debug` is too high. [8/7]", 1535809936], - [121, 7, 1365, "Metrics/MethodLength: Method has too many lines. [31/10]", 1535809936], - [222, 7, 3895, "Metrics/AbcSize: Assignment Branch Condition size for `perform_merge` is too high. [<26, 49, 15> 57.46/17]", 2422658143], - [222, 7, 3895, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `perform_merge` is too high. [13/7]", 2422658143], - [222, 7, 3895, "Metrics/MethodLength: Method has too many lines. [65/10]", 2422658143], - [222, 7, 3895, "Metrics/PerceivedComplexity: Perceived complexity for `perform_merge` is too high. [15/8]", 2422658143], - [259, 9, 1909, "Metrics/BlockLength: Block has too many lines. [33/25]", 2329089464], - [330, 7, 1051, "Metrics/MethodLength: Method has too many lines. [24/10]", 84730335], - [412, 7, 2033, "Metrics/AbcSize: Assignment Branch Condition size for `collapse_cross_source_preamble_prefixes!` is too high. [<16, 37, 12> 42.06/17]", 2353798937], - [412, 7, 2033, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `collapse_cross_source_preamble_prefixes!` is too high. [13/7]", 2353798937], - [412, 7, 2033, "Metrics/MethodLength: Method has too many lines. [30/10]", 2353798937], - [412, 7, 2033, "Metrics/PerceivedComplexity: Perceived complexity for `collapse_cross_source_preamble_prefixes!` is too high. [13/8]", 2353798937], - [450, 7, 534, "Metrics/MethodLength: Method has too many lines. [15/10]", 4188914818], - [472, 7, 683, "Metrics/AbcSize: Assignment Branch Condition size for `leading_standalone_comment_entries` is too high. [<8, 19, 6> 21.47/17]", 496096949], - [472, 7, 683, "Metrics/MethodLength: Method has too many lines. [17/10]", 496096949], - [520, 7, 1210, "Metrics/AbcSize: Assignment Branch Condition size for `root_boundary_lines_for` is too high. [<7, 32, 25> 41.21/17]", 2597480626], - [520, 7, 1210, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `root_boundary_lines_for` is too high. [23/7]", 2597480626], - [520, 7, 1210, "Metrics/MethodLength: Method has too many lines. [22/10]", 2597480626], - [520, 7, 1210, "Metrics/PerceivedComplexity: Perceived complexity for `root_boundary_lines_for` is too high. [22/8]", 2597480626], - [521, 34, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], - [527, 121, 6, "Layout/LineLength: Line is too long. [126/120]", 1182436848], - [549, 7, 737, "Metrics/AbcSize: Assignment Branch Condition size for `emission_start_line_for` is too high. [<5, 16, 14> 21.84/17]", 2185143026], - [549, 7, 737, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emission_start_line_for` is too high. [12/7]", 2185143026], - [549, 7, 737, "Metrics/MethodLength: Method has too many lines. [11/10]", 2185143026], - [549, 7, 737, "Metrics/PerceivedComplexity: Perceived complexity for `emission_start_line_for` is too high. [13/8]", 2185143026], - [554, 39, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], - [567, 7, 820, "Metrics/MethodLength: Method has too many lines. [16/10]", 326278669], - [603, 43, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], - [697, 7, 911, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `preference_for_pair` is too high. [10/7]", 2626776987], - [697, 7, 911, "Metrics/MethodLength: Method has too many lines. [12/10]", 2626776987], - [697, 7, 911, "Metrics/PerceivedComplexity: Perceived complexity for `preference_for_pair` is too high. [10/8]", 2626776987], - [716, 7, 1370, "Metrics/MethodLength: Method has too many lines. [33/10]", 4039645241], - [770, 23, 131, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 113192658] + "lib/bash/merge/smart_merger.rb:3661050993": [ + [37, 5, 29940, "Metrics/ClassLength: Class has too many lines. [557/100]", 599912827], + [62, 7, 1020, "Metrics/MethodLength: Method has too many lines. [15/10]", 746325062], + [62, 21, 401, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [13/5]", 1661881927], + [122, 7, 1365, "Metrics/AbcSize: Assignment Branch Condition size for `merge_with_debug` is too high. [<3, 24, 7> 25.18/17]", 1535809936], + [122, 7, 1365, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `merge_with_debug` is too high. [8/7]", 1535809936], + [122, 7, 1365, "Metrics/MethodLength: Method has too many lines. [31/10]", 1535809936], + [223, 7, 3977, "Metrics/AbcSize: Assignment Branch Condition size for `perform_merge` is too high. [<30, 51, 15> 61.04/17]", 1524282235], + [223, 7, 3977, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `perform_merge` is too high. [13/7]", 1524282235], + [223, 7, 3977, "Metrics/MethodLength: Method has too many lines. [66/10]", 1524282235], + [223, 7, 3977, "Metrics/PerceivedComplexity: Perceived complexity for `perform_merge` is too high. [15/8]", 1524282235], + [261, 9, 1909, "Metrics/BlockLength: Block has too many lines. [33/25]", 2329089464], + [332, 7, 1051, "Metrics/MethodLength: Method has too many lines. [24/10]", 84730335], + [414, 7, 2033, "Metrics/AbcSize: Assignment Branch Condition size for `collapse_cross_source_preamble_prefixes!` is too high. [<16, 37, 12> 42.06/17]", 2353798937], + [414, 7, 2033, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `collapse_cross_source_preamble_prefixes!` is too high. [13/7]", 2353798937], + [414, 7, 2033, "Metrics/MethodLength: Method has too many lines. [30/10]", 2353798937], + [414, 7, 2033, "Metrics/PerceivedComplexity: Perceived complexity for `collapse_cross_source_preamble_prefixes!` is too high. [13/8]", 2353798937], + [452, 7, 534, "Metrics/MethodLength: Method has too many lines. [15/10]", 4188914818], + [474, 7, 683, "Metrics/AbcSize: Assignment Branch Condition size for `leading_standalone_comment_entries` is too high. [<8, 19, 6> 21.47/17]", 496096949], + [474, 7, 683, "Metrics/MethodLength: Method has too many lines. [17/10]", 496096949], + [542, 7, 970, "Metrics/MethodLength: Method has too many lines. [18/10]", 3638795219], + [580, 43, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [672, 9, 51, "Lint/HashCompareByIdentity: Use `Hash#compare_by_identity` instead of using `object_id` for keys.", 127173805], + [678, 7, 911, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `preference_for_pair` is too high. [10/7]", 2626776987], + [678, 7, 911, "Metrics/MethodLength: Method has too many lines. [12/10]", 2626776987], + [678, 7, 911, "Metrics/PerceivedComplexity: Perceived complexity for `preference_for_pair` is too high. [10/8]", 2626776987], + [697, 7, 1370, "Metrics/MethodLength: Method has too many lines. [33/10]", 4039645241], + [751, 23, 131, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 113192658], + [774, 32, 51, "Lint/HashCompareByIdentity: Use `Hash#compare_by_identity` instead of using `object_id` for keys.", 127173805], + [787, 32, 51, "Lint/HashCompareByIdentity: Use `Hash#compare_by_identity` instead of using `object_id` for keys.", 127173805] ], "spec/bash/merge/comment_tracker_spec.rb:2839895745": [ [5, 1, 5867, "Metrics/BlockLength: Block has too many lines. [179/25]", 853150752], @@ -204,9 +212,9 @@ [266, 3, 1249, "Metrics/BlockLength: Block has too many lines. [37/25]", 546398620], [316, 3, 1101, "Metrics/BlockLength: Block has too many lines. [26/25]", 3599684932] ], - "spec/bash/merge_spec.rb:4280322597": [ - [5, 1, 4187, "Metrics/BlockLength: Block has too many lines. [108/25]", 2384192474], - [85, 3, 1146, "Metrics/BlockLength: Block has too many lines. [26/25]", 3618532423] + "spec/bash/merge_spec.rb:2513735456": [ + [5, 1, 4411, "Metrics/BlockLength: Block has too many lines. [113/25]", 2384192474], + [91, 3, 1146, "Metrics/BlockLength: Block has too many lines. [26/25]", 3618532423] ], "spec/support/shared_examples/file_analysis_examples.rb:3893834393": [ [8, 1, 1573, "Metrics/BlockLength: Block has too many lines. [36/25]", 1729754427], diff --git a/gems/bash-merge/.simplecov b/gems/bash-merge/.simplecov index c15dc3323..a1fbcf6e3 100644 --- a/gems/bash-merge/.simplecov +++ b/gems/bash-merge/.simplecov @@ -4,15 +4,11 @@ # bash-merge will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/bash-merge/.structuredmerge/kettle-jem.yml b/gems/bash-merge/.structuredmerge/kettle-jem.yml index 11d9d916a..b7d640fd2 100644 --- a/gems/bash-merge/.structuredmerge/kettle-jem.yml +++ b/gems/bash-merge/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/bash/merge/version.rb - source: sig/gem.rbs diff --git a/gems/bash-merge/Gemfile b/gems/bash-merge/Gemfile index 7e465932f..d63bad96f 100644 --- a/gems/bash-merge/Gemfile +++ b/gems/bash-merge/Gemfile @@ -37,300 +37,8 @@ if direct_sibling_gems.any? && ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) + require 'nomono/bundler' begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( @@ -339,8 +47,6 @@ if direct_sibling_gems.any? && path_env: 'STRUCTUREDMERGE_DEV', root: %w[src my structuredmerge] ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -352,62 +58,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -415,7 +67,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/bash-merge/Gemfile.lock b/gems/bash-merge/Gemfile.lock index c7941d078..c08db9d56 100644 --- a/gems/bash-merge/Gemfile.lock +++ b/gems/bash-merge/Gemfile.lock @@ -6,272 +6,6 @@ PATH tree_haver (= 7.1.0) version_gem (~> 1.1, >= 1.1.14) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,22 +16,26 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +43,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +73,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +92,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +116,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,7 +125,6 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) mutex_m (0.3.0) nokogiri (1.19.4-aarch64-linux-gnu) racc (~> 1.4) @@ -398,13 +132,11 @@ GEM racc (~> 1.4) nokogiri (1.19.4-arm64-darwin) racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-musl) racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +157,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +212,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +227,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +266,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -530,28 +287,22 @@ GEM ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) - service_actor (3.9.4) - zeitwerk (>= 1.0) silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +315,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +338,20 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-aarch64-linux) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-arm64-darwin) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +361,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -628,117 +392,79 @@ PLATFORMS aarch64-linux-gnu aarch64-linux-musl arm64-darwin - x86_64-darwin + x86_64-linux x86_64-linux-gnu x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.2, >= 3.2.0) - ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! - ast-template! + appraisal2-rubocop (~> 1.0, >= 1.0.0) bash-merge! benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! - commonmarker-merge! + cgi (~> 0.5) debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.4) - go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.3, >= 2.3.7) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) - kettle-test (~> 2.0, >= 2.0.11) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kettle-soup-cover (~> 3.0, >= 3.0.3) + kettle-test (~> 2.0, >= 2.0.12) + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) - stone_checksums (~> 1.0, >= 1.0.6, >= 1.0.3) + standard (~> 1.56, >= 1.56.0) + stone_checksums (~> 1.0, >= 1.0.6) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! + tree_sitter_language_pack (~> 1.13, >= 1.13.3) turbo_tests2 (~> 3.2, >= 3.2.0) - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 - ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -747,61 +473,46 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 - json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 - markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -819,35 +530,37 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) - service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -856,20 +569,18 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-aarch64-linux) sha256=55ffc7c87868cb45658338363d9eba51b4a8b0259aa88e4de368d2bd1d52fea4 + tree_sitter_language_pack (1.13.3-arm64-darwin) sha256=bc2498db605f212a1dbd2465ed3f65190d7da786f6ed5d30fcf958121aeb4a5c + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -877,8 +588,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/bash-merge/LICENSE.md b/gems/bash-merge/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/bash-merge/LICENSE.md +++ b/gems/bash-merge/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/bash-merge/README.md b/gems/bash-merge/README.md index 2e1055710..84b82b723 100644 --- a/gems/bash-merge/README.md +++ b/gems/bash-merge/README.md @@ -75,8 +75,8 @@ File.write("merged.sh", result.to_bash) | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -293,7 +293,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -319,6 +319,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/bash-merge [⛳️namespace-img]: https://img.shields.io/badge/namespace-Bash::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white @@ -363,7 +365,7 @@ If none of the available licenses suit your use case, please [contact us](mailto [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/bash-merge [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/bash-merge -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/bash-merge [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/bash-merge/bash-merge.gemspec b/gems/bash-merge/bash-merge.gemspec index 2e634fb4e..86240b5af 100644 --- a/gems/bash-merge/bash-merge.gemspec +++ b/gems/bash-merge/bash-merge.gemspec @@ -116,13 +116,17 @@ Gem::Specification.new do |spec| # Testing spec.add_development_dependency('appraisal2', '~> 3.2', '>= 3.2.0') # ruby >= 1.8.7, for testing against multiple versions of dependencies - spec.add_development_dependency('kettle-test', '~> 2.0', '>= 2.0.11') # ruby >= 4.0.0 + spec.add_development_dependency('kettle-test', '~> 2.0', '>= 2.0.12') # ruby >= 4.0.0 spec.add_development_dependency('turbo_tests2', '~> 3.2', '>= 3.2.0') # ruby >= 2.4.0, default kettle-test runner # Releasing spec.add_development_dependency('ruby-progressbar', '~> 1.13') # ruby >= 0 spec.add_development_dependency('stone_checksums', '~> 1.0', '>= 1.0.6') # ruby >= 2.2.0 + # Development tasks + # The cake is a lie. erb v2.2, the oldest release, was never compatible with Ruby 2.3. + # This means we have no choice but to use the erb that shipped with Ruby 2.3 + # /opt/hostedtoolcache/Ruby/2.3.8/x64/lib/ruby/gems/2.3.0/gems/erb-2.2.2/lib/erb.rb:670:in `prepare_trim_mode': undefined method `match?' for "-":String (NoMethodError) # spec.add_development_dependency("erb", ">= 2.2") # ruby >= 2.3.0, not SemVer, old rubies get dropped in a patch. spec.add_development_dependency('gitmoji-regex', '~> 2.0', '>= 2.0.4') # ruby >= 2.4 end diff --git a/gems/bash-merge/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/bash-merge/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/bash-merge/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/bash-merge/gemfiles/modular/cgi/vHEAD.gemfile b/gems/bash-merge/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/bash-merge/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/bash-merge/gemfiles/modular/coverage.gemfile b/gems/bash-merge/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/bash-merge/gemfiles/modular/coverage.gemfile +++ b/gems/bash-merge/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/bash-merge/gemfiles/modular/coverage_local.gemfile b/gems/bash-merge/gemfiles/modular/coverage_local.gemfile index a1b6ce3d2..e0339ae34 100644 --- a/gems/bash-merge/gemfiles/modular/coverage_local.gemfile +++ b/gems/bash-merge/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[bash-merge] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/bash-merge/gemfiles/modular/documentation.gemfile b/gems/bash-merge/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/bash-merge/gemfiles/modular/documentation.gemfile +++ b/gems/bash-merge/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/bash-merge/gemfiles/modular/documentation_local.gemfile b/gems/bash-merge/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..cd075e67e 100644 --- a/gems/bash-merge/gemfiles/modular/documentation_local.gemfile +++ b/gems/bash-merge/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[bash-merge] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/bash-merge/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/bash-merge/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/bash-merge/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/bash-merge/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/bash-merge/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/bash-merge/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/bash-merge/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/bash-merge/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/bash-merge/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/bash-merge/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/bash-merge/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/bash-merge/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/bash-merge/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/bash-merge/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/bash-merge/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/bash-merge/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/bash-merge/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/bash-merge/gemfiles/modular/optional.gemfile b/gems/bash-merge/gemfiles/modular/optional.gemfile index 831371a19..9ea429538 100644 --- a/gems/bash-merge/gemfiles/modular/optional.gemfile +++ b/gems/bash-merge/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during bash-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/bash-merge/gemfiles/modular/runtime_heads.gemfile b/gems/bash-merge/gemfiles/modular/runtime_heads.gemfile index 282073e0d..ebf17c529 100644 --- a/gems/bash-merge/gemfiles/modular/runtime_heads.gemfile +++ b/gems/bash-merge/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during bash-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/bash-merge/gemfiles/modular/style.gemfile b/gems/bash-merge/gemfiles/modular/style.gemfile index 515974f89..4dbcc02c0 100644 --- a/gems/bash-merge/gemfiles/modular/style.gemfile +++ b/gems/bash-merge/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during bash-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/bash-merge/gemfiles/modular/style_local.gemfile b/gems/bash-merge/gemfiles/modular/style_local.gemfile index ce75bbe21..92e1027e1 100644 --- a/gems/bash-merge/gemfiles/modular/style_local.gemfile +++ b/gems/bash-merge/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[bash-merge] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/bash-merge/gemfiles/modular/templating.gemfile b/gems/bash-merge/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/bash-merge/gemfiles/modular/templating.gemfile +++ b/gems/bash-merge/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/bash-merge/gemfiles/modular/templating_local.gemfile b/gems/bash-merge/gemfiles/modular/templating_local.gemfile index b0ef57bb2..f8ee64dc9 100644 --- a/gems/bash-merge/gemfiles/modular/templating_local.gemfile +++ b/gems/bash-merge/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[bash-merge] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[bash-merge] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[bash-merge] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/bash-merge/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/bash-merge/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/bash-merge/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/bash-merge/gemfiles/modular/webrick/vHEAD.gemfile b/gems/bash-merge/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/bash-merge/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/bash-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/bash-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/bash-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/bash-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/bash-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/bash-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/bash-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/bash-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/bash-merge/lib/bash/merge.rb b/gems/bash-merge/lib/bash/merge.rb index 5589ffdf2..898b2fa3a 100644 --- a/gems/bash-merge/lib/bash/merge.rb +++ b/gems/bash-merge/lib/bash/merge.rb @@ -165,10 +165,16 @@ def bash_grammar_path(diagnostics) end def node_parser_available_for?(source, grammar_path, diagnostics) + register_backend! parser = if grammar_path - TreeHaver.parser_for(:bash, library_path: grammar_path) + TreeHaver.with_language_registration( + :bash, + :tree_sitter, + path: grammar_path, + symbol: TreeHaver::GrammarFinder.new(:bash).symbol_name + ) { TreeHaver.parser_for(:bash, backend_type: :tree_sitter) } else - TreeHaver.parser_for(:bash) + TreeHaver.parser_for(:bash, backend_type: :tree_sitter) end tree = parser.parse(source) !tree.nil? && !tree.root_node.nil? @@ -182,10 +188,15 @@ def node_parser_available_for?(source, grammar_path, diagnostics) def bash_backend_available_for_analysis?(backend_id) register_backend! - return false unless backend_id.to_s == TREE_SITTER_BACKEND.id - registrations = TreeHaver.registered_languages(:bash) - registrations.key?(:tree_sitter) || registrations.key?(:tslp) + if backend_id.to_s.empty? + TreeHaver.parser_for(:bash, backend_type: :tree_sitter) + else + TreeHaver.with_backend(backend_id) { TreeHaver.parser_for(:bash, backend_type: :tree_sitter) } + end + true + rescue TreeHaver::Error, ArgumentError + false end end end diff --git a/gems/bash-merge/lib/bash/merge/file_analysis.rb b/gems/bash-merge/lib/bash/merge/file_analysis.rb index cebfe49c8..425fd3d3d 100644 --- a/gems/bash-merge/lib/bash/merge/file_analysis.rb +++ b/gems/bash-merge/lib/bash/merge/file_analysis.rb @@ -47,7 +47,7 @@ def initialize(source, freeze_token: DEFAULT_FREEZE_TOKEN, signature_generator: @lines = source.lines.map(&:chomp) @freeze_token = freeze_token @signature_generator = signature_generator - @parser_path = parser_path || self.class.find_parser_path + @parser_path = parser_path @errors = [] # **options captures any additional parameters (e.g., node_typing) for forward compatibility @@ -230,7 +230,16 @@ def parse_bash # TreeHaver handles backend selection against the grammars Bash::Merge # has already registered during bootstrap. # Set TREE_HAVER_BACKEND=ffi for bash (MRI/Rust have compatibility issues) - parser = TreeHaver.parser_for(:bash, library_path: @parser_path) + parser = if @parser_path + TreeHaver.with_language_registration( + :bash, + :tree_sitter, + path: @parser_path, + symbol: TreeHaver::GrammarFinder.new(:bash).symbol_name + ) { TreeHaver.parser_for(:bash, backend_type: :tree_sitter) } + else + TreeHaver.parser_for(:bash, backend_type: :tree_sitter) + end @ast = parser.parse(@source) # Check for parse errors in the tree diff --git a/gems/bash-merge/lib/bash/merge/smart_merger.rb b/gems/bash-merge/lib/bash/merge/smart_merger.rb index ca27dc1d8..79a35d15e 100644 --- a/gems/bash-merge/lib/bash/merge/smart_merger.rb +++ b/gems/bash-merge/lib/bash/merge/smart_merger.rb @@ -38,6 +38,7 @@ class SmartMerger < ::Ast::Merge::SmartMergerBase include ::Ast::Merge::TrailingGroups::DestIterate include ::Ast::Merge::Runtime::RootSessionSupport include ::Ast::Merge::StructuredEmitterProvenanceSupport + include ::Ast::Merge::CommentLayoutEmissionSupport # Creates a new SmartMerger for intelligent Bash script merging. # @@ -224,6 +225,7 @@ def perform_merge dest_nodes = @dest_analysis.nodes emitter = Emitter.new + @emitted_preserved_line_numbers = Hash.new { |hash, key| hash[key] = [] } emit_root_boundary_to(emitter, :preamble) @@ -495,9 +497,12 @@ def leading_standalone_comment_entries(emitter) def handle_destination_only_node(emitter, dest_node) if remove_template_missing_nodes - emit_leading_segment_to(emitter, dest_node, @dest_analysis) - emit_preserved_floating_gap_to(emitter, dest_node, @dest_analysis) - emit_promoted_inline_comment_to(emitter, dest_node, @dest_analysis) + lines = removed_destination_node_lines_for(dest_node, @dest_analysis) + if lines.any? + start_line = emission_start_line_for(dest_node, @dest_analysis) + emitter.emit_raw_lines(lines, metadata: emitter_block_metadata(@dest_analysis, start_line)) + mark_removed_destination_preserved_lines(dest_node, @dest_analysis) + end else emit_node_to(emitter, dest_node, @dest_analysis) end @@ -518,49 +523,19 @@ def root_boundary_analysis_candidates end def root_boundary_lines_for(kind, analysis) - return [] unless analysis&.respond_to?(:statements) - if kind == :preamble && Array(analysis.statements).empty? && analysis.respond_to?(:lines) && analysis.lines.any? - return analysis.lines.dup - end - - statements = Array(analysis.statements).select do |statement| - statement.respond_to?(:start_line) && statement.respond_to?(:end_line) && statement.start_line && statement.end_line - end - return [] if statements.empty? - - case kind - when :preamble - first_statement = statements.min_by(&:start_line) - start_line = emission_start_line_for(first_statement, analysis) - return [] unless start_line && start_line > 1 - - (1...start_line).filter_map { |line_number| analysis.line_at(line_number) } - when :postlude - last_line = statements.map(&:end_line).compact.max - return [] unless last_line && analysis.respond_to?(:lines) - return [] if last_line >= analysis.lines.length - - ((last_line + 1)..analysis.lines.length).filter_map { |line_number| analysis.line_at(line_number) } - else - [] - end + super(kind, analysis, owners: analysis.nodes, fallback_to_owner_bounds: true) end def emission_start_line_for(node, analysis) - return unless node.respond_to?(:start_line) && node.start_line - - attachment = analysis.comment_attachment_for(node) - leading_region = attachment&.leading_region - start_line = if leading_region&.respond_to?(:start_line) && leading_region.start_line - leading_region.start_line - else - leading_comments = analysis.comment_tracker.leading_comments_before(node.start_line) - leading_comments.first&.fetch(:line, nil) || node.start_line - end + region_start = region_start_line(leading_region_for(node, analysis)) + comment_start = analysis.comment_tracker.leading_comments_before(node.start_line).first&.fetch(:line, nil) + preceding_blank_line_start(region_start || comment_start || node.start_line, analysis) + end - start_line -= 1 while start_line > 1 && analysis.line_at(start_line - 1)&.strip == '' + def root_boundary_owner_start_line_for(node, analysis) + return node.start_line unless region_present?(leading_region_for(node, analysis)) - start_line + emission_start_line_for(node, analysis) end # Emit the preferred version of a matched node pair. @@ -568,10 +543,12 @@ def emit_preferred(emitter, template_node, dest_node) pref = preference_for_pair(template_node, dest_node) record_unresolved_choice(template_node: template_node, dest_node: dest_node, provisional_winner: pref) if pref == :destination + emit_retained_leading_gap_to(emitter, dest_node, @dest_analysis) emit_node_to(emitter, dest_node, @dest_analysis) else comment_source_node, comment_source_analysis = preferred_comment_source_for(template_node, dest_node) inline_comment = preferred_inline_comment_for(template_node, dest_node) + emit_retained_leading_gap_to(emitter, dest_node, @dest_analysis) emit_node_to( emitter, template_node, @@ -667,23 +644,12 @@ def safe_inline_comment_node?(node) (node.respond_to?(:variable_assignment?) && node.variable_assignment?) end - def emit_promoted_inline_comment_to(emitter, node, analysis) + def promoted_inline_comment_lines_for(node, analysis) inline_comment = inline_comment_for(node, analysis) - return unless inline_comment && single_line_node?(node) && safe_inline_comment_node?(node) + return [] unless inline_comment && single_line_node?(node) && safe_inline_comment_node?(node) line = promoted_inline_comment_line_for(node, analysis, inline_comment) - emitter.emit_raw_lines([line], metadata: emitter_line_metadata(analysis, line_number: node.start_line)) if line - end - - def emit_preserved_floating_gap_to(emitter, node, analysis) - attachment = analysis.comment_attachment_for(node) - return unless attachment&.leading_region - - trailing_gap = attachment.trailing_gap - return unless trailing_gap - return unless trailing_gap.effective_controller_side(removed_owners: [node]) == :after - - emitter.emit_raw_lines(trailing_gap.lines, metadata: emitter_block_metadata(analysis, trailing_gap.start_line)) + line ? [line] : [] end def promoted_inline_comment_line_for(node, analysis, inline_comment) @@ -693,6 +659,21 @@ def promoted_inline_comment_line_for(node, analysis, inline_comment) "#{raw_line[/\A\s*/]}#{inline_comment[:raw].sub(/\A\s+/, '')}" end + def removed_destination_node_lines_for(node, analysis) + removed_owner_preserved_lines_for( + node, + analysis, + owners: analysis.nodes, + inline_lines: promoted_inline_comment_lines_for(node, analysis) + ) + end + + def mark_removed_destination_preserved_lines(node, analysis) + @emitted_preserved_line_numbers[analysis.object_id].concat( + removed_owner_preserved_line_numbers_for(node, analysis, owners: analysis.nodes) + ) + end + # Determine preference for a matched pair, respecting per-type overrides. def preference_for_pair(template_node, dest_node) return @preference unless @preference.is_a?(Hash) @@ -789,14 +770,29 @@ def apply_inline_comment(lines, inline_comment) end def emit_leading_segment_to(emitter, node, analysis) - return unless node.respond_to?(:start_line) && node.start_line + line_numbers = leading_segment_line_numbers_for(node, analysis, owners: analysis.nodes) + emitted_line_numbers = @emitted_preserved_line_numbers[analysis.object_id] + line_numbers = line_numbers.reject { |line_number| emitted_line_numbers.include?(line_number) } + return if line_numbers.empty? - start_line = emission_start_line_for(node, analysis) - return unless start_line && start_line < node.start_line - - lines = (start_line...node.start_line).filter_map { |line_number| analysis.line_at(line_number) } + lines = line_numbers.filter_map { |line_number| analysis.line_at(line_number) } + start_line = line_numbers.first emitter.emit_raw_lines(lines, metadata: emitter_block_metadata(analysis, start_line)) end + + def emit_retained_leading_gap_to(emitter, node, analysis) + gap = retained_owner_leading_gap_for(node, analysis) + return unless gap + + emitted_line_numbers = @emitted_preserved_line_numbers[analysis.object_id] + line_numbers = (gap.start_line..gap.end_line).reject do |line_number| + emitted_line_numbers.include?(line_number) + end + return if line_numbers.empty? + + lines = line_numbers.filter_map { |line_number| analysis.line_at(line_number) } + emitter.emit_raw_lines(lines, metadata: emitter_block_metadata(analysis, line_numbers.first)) + end end end end diff --git a/gems/bash-merge/spec/bash/merge/comment_behavior_matrix_spec.rb b/gems/bash-merge/spec/bash/merge/comment_behavior_matrix_spec.rb index 35fc8578c..d740a5843 100644 --- a/gems/bash-merge/spec/bash/merge/comment_behavior_matrix_spec.rb +++ b/gems/bash-merge/spec/bash/merge/comment_behavior_matrix_spec.rb @@ -18,5 +18,7 @@ inline ? "#{line} # #{inline}" : line end ) + + it_behaves_like 'Ast::Merge::RetainedBlankGapCompliance' end end diff --git a/gems/bash-merge/spec/spec_helper.rb b/gems/bash-merge/spec/spec_helper.rb index 58ea9f84e..c12e2bf49 100644 --- a/gems/bash-merge/spec/spec_helper.rb +++ b/gems/bash-merge/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/binary-merge/.kettle-drift.lock b/gems/binary-merge/.kettle-drift.lock deleted file mode 100644 index f1287e677..000000000 --- a/gems/binary-merge/.kettle-drift.lock +++ /dev/null @@ -1,337 +0,0 @@ -{ - "(direct_sibling_local ||\nENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)": [ - { - "file": "Gemfile", - "lines": [ - 79, - 119, - 159, - 199, - 239, - 279, - 319, - 359, - 399 - ] - } - ], - ".find { |spec| spec.name == 'nomono' }\nnomono_locked = nomono_locked_spec &&": [ - { - "file": "Gemfile", - "lines": [ - 90, - 130, - 170, - 210, - 250, - 290, - 330, - 370, - 410 - ] - } - ], - "ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)\ndirect_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')": [ - { - "file": "Gemfile", - "lines": [ - 80, - 120, - 160, - 200, - 240, - 280, - 320, - 360, - 400 - ] - } - ], - "Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)\nnomono_activation_requirements = [\"= #{nomono_locked_spec.version}\"] if nomono_locked": [ - { - "file": "Gemfile", - "lines": [ - 92, - 132, - 172, - 212, - 252, - 292, - 332, - 372, - 412 - ] - } - ], - "Kernel.send(:gem, 'nomono', *nomono_activation_requirements)\nrequire 'nomono/bundler'": [ - { - "file": "Gemfile", - "lines": [ - 95, - 135, - 175, - 215, - 255, - 295, - 335, - 375, - 415 - ] - } - ], - "direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')\ndirect_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)": [ - { - "file": "Gemfile", - "lines": [ - 81, - 121, - 161, - 201, - 241, - 281, - 321, - 361, - 401 - ] - } - ], - "eval_nomono_gems(\ngems: direct_sibling_gems,": [ - { - "file": "Gemfile", - "lines": [ - 59, - 99, - 139, - 179, - 219, - 259, - 299, - 339, - 379, - 419 - ] - } - ], - "gems: direct_sibling_gems,\nprefix: 'STRUCTUREDMERGE',": [ - { - "file": "Gemfile", - "lines": [ - 100, - 140, - 180, - 220, - 260, - 300, - 340, - 380, - 420 - ] - } - ], - "if File.file?(nomono_lockfile)\nnomono_locked_spec = Bundler::LockfileParser": [ - { - "file": "Gemfile", - "lines": [ - 42, - 86, - 126, - 166, - 206, - 246, - 286, - 326, - 366, - 406 - ] - } - ], - "if direct_sibling_dev_was_set\nENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original": [ - { - "file": "Gemfile", - "lines": [ - 109, - 149, - 189, - 229, - 269, - 309, - 349, - 389, - 429 - ] - } - ], - "if direct_sibling_gems.any? &&\n(direct_sibling_local ||": [ - { - "file": "Gemfile", - "lines": [ - 34, - 78, - 118, - 158, - 198, - 238, - 278, - 318, - 358, - 398 - ] - } - ], - "if direct_sibling_templating && !direct_sibling_local\nif direct_sibling_dev_was_set": [ - { - "file": "Gemfile", - "lines": [ - 68, - 108, - 148, - 188, - 228, - 268, - 308, - 348, - 388, - 428 - ] - } - ], - "nomono_activation_requirements = nomono_requirements\nnomono_lockfile = File.expand_path('Gemfile.lock', __dir__)": [ - { - "file": "Gemfile", - "lines": [ - 84, - 124, - 164, - 204, - 244, - 284, - 324, - 364, - 404 - ] - } - ], - "nomono_locked = nomono_locked_spec &&\nGem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)": [ - { - "file": "Gemfile", - "lines": [ - 47, - 91, - 131, - 171, - 211, - 251, - 291, - 331, - 371, - 411 - ] - } - ], - "nomono_locked_spec = Bundler::LockfileParser\n.new(Bundler.read_file(nomono_lockfile))": [ - { - "file": "Gemfile", - "lines": [ - 43, - 87, - 127, - 167, - 207, - 247, - 287, - 327, - 367, - 407 - ] - } - ], - "nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)\nif File.file?(nomono_lockfile)": [ - { - "file": "Gemfile", - "lines": [ - 85, - 125, - 165, - 205, - 245, - 285, - 325, - 365, - 405 - ] - } - ], - "path_env: 'STRUCTUREDMERGE_DEV',\nroot: %w[src my structuredmerge]": [ - { - "file": "Gemfile", - "lines": [ - 102, - 142, - 182, - 222, - 262, - 302, - 342, - 382, - 422 - ] - } - ], - "prefix: 'STRUCTUREDMERGE',\npath_env: 'STRUCTUREDMERGE_DEV',": [ - { - "file": "Gemfile", - "lines": [ - 101, - 141, - 181, - 221, - 261, - 301, - 341, - 381, - 421 - ] - } - ], - "require 'nomono/bundler'\nENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local": [ - { - "file": "Gemfile", - "lines": [ - 96, - 136, - 176, - 216, - 256, - 296, - 336, - 376, - 416 - ] - } - ], - "rescue LoadError\nwarn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'": [ - { - "file": "Gemfile", - "lines": [ - 105, - 145, - 185, - 225, - 265, - 305, - 345, - 385, - 425 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 - ] - } - ] -} diff --git a/gems/binary-merge/.rubocop_gradual.lock b/gems/binary-merge/.rubocop_gradual.lock index 409104dc1..970768c26 100644 --- a/gems/binary-merge/.rubocop_gradual.lock +++ b/gems/binary-merge/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:2434553742": [ + ".simplecov:3809455317": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:273093165": [ @@ -21,13 +21,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -63,6 +70,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -72,10 +86,10 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], diff --git a/gems/binary-merge/.simplecov b/gems/binary-merge/.simplecov index 74cd7d254..b52146834 100644 --- a/gems/binary-merge/.simplecov +++ b/gems/binary-merge/.simplecov @@ -4,15 +4,11 @@ # binary-merge will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/binary-merge/.structuredmerge/kettle-jem.yml b/gems/binary-merge/.structuredmerge/kettle-jem.yml index a5ddade46..12b0dcc81 100644 --- a/gems/binary-merge/.structuredmerge/kettle-jem.yml +++ b/gems/binary-merge/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/binary/merge/version.rb - source: sig/gem.rbs diff --git a/gems/binary-merge/Gemfile b/gems/binary-merge/Gemfile index 0a94ca078..2b5f7f621 100644 --- a/gems/binary-merge/Gemfile +++ b/gems/binary-merge/Gemfile @@ -36,260 +36,8 @@ if direct_sibling_gems.any? && ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) + require 'nomono/bundler' begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( @@ -298,8 +46,6 @@ if direct_sibling_gems.any? && path_env: 'STRUCTUREDMERGE_DEV', root: %w[src my structuredmerge] ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -311,142 +57,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -454,7 +66,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/binary-merge/Gemfile.lock b/gems/binary-merge/Gemfile.lock index 41b29f356..fbcb3ea41 100644 --- a/gems/binary-merge/Gemfile.lock +++ b/gems/binary-merge/Gemfile.lock @@ -5,273 +5,6 @@ PATH tree_haver (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,6 +15,10 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) backports (3.25.3) benchmark (0.5.0) @@ -289,15 +26,10 @@ GEM bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +37,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +67,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +86,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +110,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,7 +119,6 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) mutex_m (0.3.0) nokogiri (1.19.4-aarch64-linux-gnu) racc (~> 1.4) @@ -398,13 +126,11 @@ GEM racc (~> 1.4) nokogiri (1.19.4-arm64-darwin) racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-musl) racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +151,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +206,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +221,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +260,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -530,28 +281,22 @@ GEM ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) - service_actor (3.9.4) - zeitwerk (>= 1.0) silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +309,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +332,17 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + tree_haver (7.1.0) + citrus (~> 3.0) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-aarch64-linux) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-arm64-darwin) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +352,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -628,116 +383,77 @@ PLATFORMS aarch64-linux-gnu aarch64-linux-musl arm64-darwin - x86_64-darwin + x86_64-linux x86_64-linux-gnu x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.0, >= 3.0.6) - ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! - ast-template! - bash-merge! + appraisal2-rubocop (~> 1.0, >= 1.0.0) benchmark (~> 0.5, >= 0.5.0) binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! - commonmarker-merge! + cgi (~> 0.5) debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.0) - go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.0, >= 2.2.25) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) + kettle-soup-cover (~> 3.0, >= 3.0.3) kettle-test (~> 2.0, >= 2.0.9) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) + standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.3) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + tree_sitter_language_pack (~> 1.13, >= 1.13.3) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 - ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) - ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -746,61 +462,46 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 - json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 - markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -818,35 +519,37 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) - service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -855,20 +558,17 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-aarch64-linux) sha256=55ffc7c87868cb45658338363d9eba51b4a8b0259aa88e4de368d2bd1d52fea4 + tree_sitter_language_pack (1.13.3-arm64-darwin) sha256=bc2498db605f212a1dbd2465ed3f65190d7da786f6ed5d30fcf958121aeb4a5c + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -876,8 +576,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/binary-merge/LICENSE.md b/gems/binary-merge/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/binary-merge/LICENSE.md +++ b/gems/binary-merge/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/binary-merge/README.md b/gems/binary-merge/README.md index 40951dee9..d4847be52 100644 --- a/gems/binary-merge/README.md +++ b/gems/binary-merge/README.md @@ -35,8 +35,8 @@ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-ta | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -148,7 +148,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -174,6 +174,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/binary-merge [⛳️namespace-img]: https://img.shields.io/badge/namespace-Binary::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white @@ -218,7 +220,7 @@ If none of the available licenses suit your use case, please [contact us](mailto [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/binary-merge [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/binary-merge -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/binary-merge [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/binary-merge/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/binary-merge/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/binary-merge/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/binary-merge/gemfiles/modular/cgi/vHEAD.gemfile b/gems/binary-merge/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/binary-merge/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/binary-merge/gemfiles/modular/coverage.gemfile b/gems/binary-merge/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/binary-merge/gemfiles/modular/coverage.gemfile +++ b/gems/binary-merge/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/binary-merge/gemfiles/modular/coverage_local.gemfile b/gems/binary-merge/gemfiles/modular/coverage_local.gemfile index ecf9ff9cd..ab58964d2 100644 --- a/gems/binary-merge/gemfiles/modular/coverage_local.gemfile +++ b/gems/binary-merge/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[binary-merge] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/binary-merge/gemfiles/modular/documentation.gemfile b/gems/binary-merge/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/binary-merge/gemfiles/modular/documentation.gemfile +++ b/gems/binary-merge/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/binary-merge/gemfiles/modular/documentation_local.gemfile b/gems/binary-merge/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..0c55469d1 100644 --- a/gems/binary-merge/gemfiles/modular/documentation_local.gemfile +++ b/gems/binary-merge/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[binary-merge] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/binary-merge/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/binary-merge/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/binary-merge/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/binary-merge/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/binary-merge/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/binary-merge/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/binary-merge/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/binary-merge/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/binary-merge/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/binary-merge/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/binary-merge/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/binary-merge/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/binary-merge/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/binary-merge/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/binary-merge/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/binary-merge/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/binary-merge/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/binary-merge/gemfiles/modular/optional.gemfile b/gems/binary-merge/gemfiles/modular/optional.gemfile index 0508edd79..9ea429538 100644 --- a/gems/binary-merge/gemfiles/modular/optional.gemfile +++ b/gems/binary-merge/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during binary-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/binary-merge/gemfiles/modular/runtime_heads.gemfile b/gems/binary-merge/gemfiles/modular/runtime_heads.gemfile index ee93b2904..ebf17c529 100644 --- a/gems/binary-merge/gemfiles/modular/runtime_heads.gemfile +++ b/gems/binary-merge/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during binary-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/binary-merge/gemfiles/modular/style.gemfile b/gems/binary-merge/gemfiles/modular/style.gemfile index e70f4178f..4dbcc02c0 100644 --- a/gems/binary-merge/gemfiles/modular/style.gemfile +++ b/gems/binary-merge/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during binary-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/binary-merge/gemfiles/modular/style_local.gemfile b/gems/binary-merge/gemfiles/modular/style_local.gemfile index ce75bbe21..b72f13b98 100644 --- a/gems/binary-merge/gemfiles/modular/style_local.gemfile +++ b/gems/binary-merge/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[binary-merge] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/binary-merge/gemfiles/modular/templating.gemfile b/gems/binary-merge/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/binary-merge/gemfiles/modular/templating.gemfile +++ b/gems/binary-merge/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/binary-merge/gemfiles/modular/templating_local.gemfile b/gems/binary-merge/gemfiles/modular/templating_local.gemfile index 41201dc8a..eb853982c 100644 --- a/gems/binary-merge/gemfiles/modular/templating_local.gemfile +++ b/gems/binary-merge/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[binary-merge] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[binary-merge] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[binary-merge] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/binary-merge/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/binary-merge/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/binary-merge/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/binary-merge/gemfiles/modular/webrick/vHEAD.gemfile b/gems/binary-merge/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/binary-merge/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/binary-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/binary-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/binary-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/binary-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/binary-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/binary-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/binary-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/binary-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/binary-merge/spec/spec_helper.rb b/gems/binary-merge/spec/spec_helper.rb index 0b1239196..1fa393208 100644 --- a/gems/binary-merge/spec/spec_helper.rb +++ b/gems/binary-merge/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/citrus-toml-merge/.kettle-drift.lock b/gems/citrus-toml-merge/.kettle-drift.lock deleted file mode 100644 index aa01ca527..000000000 --- a/gems/citrus-toml-merge/.kettle-drift.lock +++ /dev/null @@ -1,317 +0,0 @@ -{ - "(direct_sibling_local ||\nENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)": [ - { - "file": "Gemfile", - "lines": [ - 79, - 119, - 159, - 199, - 239, - 279, - 319, - 359 - ] - } - ], - ".find { |spec| spec.name == 'nomono' }\nnomono_locked = nomono_locked_spec &&": [ - { - "file": "Gemfile", - "lines": [ - 90, - 130, - 170, - 210, - 250, - 290, - 330, - 370 - ] - } - ], - "ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)\ndirect_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')": [ - { - "file": "Gemfile", - "lines": [ - 80, - 120, - 160, - 200, - 240, - 280, - 320, - 360 - ] - } - ], - "Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)\nnomono_activation_requirements = [\"= #{nomono_locked_spec.version}\"] if nomono_locked": [ - { - "file": "Gemfile", - "lines": [ - 92, - 132, - 172, - 212, - 252, - 292, - 332, - 372 - ] - } - ], - "Kernel.send(:gem, 'nomono', *nomono_activation_requirements)\nrequire 'nomono/bundler'": [ - { - "file": "Gemfile", - "lines": [ - 95, - 135, - 175, - 215, - 255, - 295, - 335, - 375 - ] - } - ], - "direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')\ndirect_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)": [ - { - "file": "Gemfile", - "lines": [ - 81, - 121, - 161, - 201, - 241, - 281, - 321, - 361 - ] - } - ], - "eval_nomono_gems(\ngems: direct_sibling_gems,": [ - { - "file": "Gemfile", - "lines": [ - 59, - 99, - 139, - 179, - 219, - 259, - 299, - 339, - 379 - ] - } - ], - "gems: direct_sibling_gems,\nprefix: 'STRUCTUREDMERGE',": [ - { - "file": "Gemfile", - "lines": [ - 100, - 140, - 180, - 220, - 260, - 300, - 340, - 380 - ] - } - ], - "if File.file?(nomono_lockfile)\nnomono_locked_spec = Bundler::LockfileParser": [ - { - "file": "Gemfile", - "lines": [ - 42, - 86, - 126, - 166, - 206, - 246, - 286, - 326, - 366 - ] - } - ], - "if direct_sibling_dev_was_set\nENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original": [ - { - "file": "Gemfile", - "lines": [ - 109, - 149, - 189, - 229, - 269, - 309, - 349, - 389 - ] - } - ], - "if direct_sibling_gems.any? &&\n(direct_sibling_local ||": [ - { - "file": "Gemfile", - "lines": [ - 34, - 78, - 118, - 158, - 198, - 238, - 278, - 318, - 358 - ] - } - ], - "if direct_sibling_templating && !direct_sibling_local\nif direct_sibling_dev_was_set": [ - { - "file": "Gemfile", - "lines": [ - 68, - 108, - 148, - 188, - 228, - 268, - 308, - 348, - 388 - ] - } - ], - "nomono_activation_requirements = nomono_requirements\nnomono_lockfile = File.expand_path('Gemfile.lock', __dir__)": [ - { - "file": "Gemfile", - "lines": [ - 84, - 124, - 164, - 204, - 244, - 284, - 324, - 364 - ] - } - ], - "nomono_locked = nomono_locked_spec &&\nGem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)": [ - { - "file": "Gemfile", - "lines": [ - 47, - 91, - 131, - 171, - 211, - 251, - 291, - 331, - 371 - ] - } - ], - "nomono_locked_spec = Bundler::LockfileParser\n.new(Bundler.read_file(nomono_lockfile))": [ - { - "file": "Gemfile", - "lines": [ - 43, - 87, - 127, - 167, - 207, - 247, - 287, - 327, - 367 - ] - } - ], - "nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)\nif File.file?(nomono_lockfile)": [ - { - "file": "Gemfile", - "lines": [ - 85, - 125, - 165, - 205, - 245, - 285, - 325, - 365 - ] - } - ], - "path_env: 'STRUCTUREDMERGE_DEV',\nroot: %w[src my structuredmerge]": [ - { - "file": "Gemfile", - "lines": [ - 102, - 142, - 182, - 222, - 262, - 302, - 342, - 382 - ] - } - ], - "prefix: 'STRUCTUREDMERGE',\npath_env: 'STRUCTUREDMERGE_DEV',": [ - { - "file": "Gemfile", - "lines": [ - 101, - 141, - 181, - 221, - 261, - 301, - 341, - 381 - ] - } - ], - "require 'nomono/bundler'\nENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local": [ - { - "file": "Gemfile", - "lines": [ - 96, - 136, - 176, - 216, - 256, - 296, - 336, - 376 - ] - } - ], - "rescue LoadError\nwarn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'": [ - { - "file": "Gemfile", - "lines": [ - 105, - 145, - 185, - 225, - 265, - 305, - 345, - 385 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 - ] - } - ] -} diff --git a/gems/citrus-toml-merge/.rubocop_gradual.lock b/gems/citrus-toml-merge/.rubocop_gradual.lock index 6289f37c0..e33f5ebd3 100644 --- a/gems/citrus-toml-merge/.rubocop_gradual.lock +++ b/gems/citrus-toml-merge/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:362090062": [ + ".simplecov:1357546901": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:1269082253": [ @@ -21,13 +21,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -63,6 +70,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -72,10 +86,10 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], @@ -90,11 +104,11 @@ [76, 7, 1663, "Metrics/MethodLength: Method has too many lines. [27/10]", 3550313116], [139, 7, 17, "Style/Documentation: Missing top-level documentation comment for `class Citrus::Toml::Merge::SmartMerger`.", 497427992] ], - "spec/fixtures_integration_spec.rb:239117620": [ - [3, 1, 7226, "Metrics/BlockLength: Block has too many lines. [159/25]", 3966119837], - [26, 3, 1318, "Metrics/BlockLength: Block has too many lines. [34/25]", 4255752267], - [64, 3, 2344, "Metrics/BlockLength: Block has too many lines. [36/25]", 228336363], - [114, 3, 1129, "Metrics/BlockLength: Block has too many lines. [27/25]", 2358141919], - [152, 3, 1419, "Metrics/BlockLength: Block has too many lines. [29/25]", 944475815] + "spec/fixtures_integration_spec.rb:288074396": [ + [3, 1, 7435, "Metrics/BlockLength: Block has too many lines. [163/25]", 3966119837], + [26, 3, 1531, "Metrics/BlockLength: Block has too many lines. [38/25]", 106015755], + [68, 3, 2344, "Metrics/BlockLength: Block has too many lines. [36/25]", 228336363], + [118, 3, 1125, "Metrics/BlockLength: Block has too many lines. [27/25]", 2358141919], + [156, 3, 1419, "Metrics/BlockLength: Block has too many lines. [29/25]", 944475815] ] } diff --git a/gems/citrus-toml-merge/.simplecov b/gems/citrus-toml-merge/.simplecov index 1de125497..b7eba922f 100644 --- a/gems/citrus-toml-merge/.simplecov +++ b/gems/citrus-toml-merge/.simplecov @@ -4,15 +4,11 @@ # citrus-toml-merge will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/citrus-toml-merge/.structuredmerge/kettle-jem.yml b/gems/citrus-toml-merge/.structuredmerge/kettle-jem.yml index 3db063133..fe3da1912 100644 --- a/gems/citrus-toml-merge/.structuredmerge/kettle-jem.yml +++ b/gems/citrus-toml-merge/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/citrus/toml/merge/version.rb - source: sig/gem.rbs diff --git a/gems/citrus-toml-merge/Gemfile b/gems/citrus-toml-merge/Gemfile index aae6101f4..44413c221 100644 --- a/gems/citrus-toml-merge/Gemfile +++ b/gems/citrus-toml-merge/Gemfile @@ -36,300 +36,8 @@ if direct_sibling_gems.any? && ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) + require 'nomono/bundler' begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( @@ -338,8 +46,6 @@ if direct_sibling_gems.any? && path_env: 'STRUCTUREDMERGE_DEV', root: %w[src my structuredmerge] ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -351,62 +57,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -414,7 +66,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/citrus-toml-merge/Gemfile.lock b/gems/citrus-toml-merge/Gemfile.lock index 417371cb2..b0fad6c67 100644 --- a/gems/citrus-toml-merge/Gemfile.lock +++ b/gems/citrus-toml-merge/Gemfile.lock @@ -6,272 +6,6 @@ PATH toml-rb (~> 4.1) version_gem (~> 1.1, >= 1.1.9) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,22 +16,26 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +43,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +73,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +92,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +116,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,21 +125,10 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) mutex_m (0.3.0) - nokogiri (1.19.4-aarch64-linux-gnu) - racc (~> 1.4) - nokogiri (1.19.4-aarch64-linux-musl) - racc (~> 1.4) - nokogiri (1.19.4-arm64-darwin) - racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.19.4-x86_64-linux-musl) - racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +149,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +204,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +219,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +258,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -530,28 +279,22 @@ GEM ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) - service_actor (3.9.4) - zeitwerk (>= 1.0) silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +307,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +330,23 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) + version_gem (~> 1.1, >= 1.1.14) + toml-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) toml-rb (4.2.0) citrus (~> 3.0, > 3.0) racc (~> 1.7) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +356,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -624,120 +383,77 @@ GEM zlib (3.2.3) PLATFORMS - aarch64-linux - aarch64-linux-gnu - aarch64-linux-musl - arm64-darwin - x86_64-darwin + x86_64-linux x86_64-linux-gnu - x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.0, >= 3.0.6) - ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! - ast-template! - bash-merge! + appraisal2-rubocop (~> 1.0, >= 1.0.0) benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) + cgi (~> 0.5) citrus-toml-merge! - commonmarker-merge! debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.0) - go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.0, >= 2.2.25) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) + kettle-soup-cover (~> 3.0, >= 3.0.3) kettle-test (~> 2.0, >= 2.0.9) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) + standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.3) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + tree_sitter_language_pack (~> 1.13, >= 1.13.3) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 - ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -746,61 +462,42 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 - json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 - markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 - nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f - nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af - nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a - nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -818,35 +515,37 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) - service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -855,20 +554,18 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c toml-merge (7.1.0) toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -876,8 +573,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/citrus-toml-merge/LICENSE.md b/gems/citrus-toml-merge/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/citrus-toml-merge/LICENSE.md +++ b/gems/citrus-toml-merge/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/citrus-toml-merge/README.md b/gems/citrus-toml-merge/README.md index 588d76f25..ff5c73ad1 100644 --- a/gems/citrus-toml-merge/README.md +++ b/gems/citrus-toml-merge/README.md @@ -36,8 +36,8 @@ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-ta | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -155,7 +155,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -181,6 +181,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/citrus-toml-merge [⛳️namespace-img]: https://img.shields.io/badge/namespace-Citrus::Toml::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white @@ -225,7 +227,7 @@ If none of the available licenses suit your use case, please [contact us](mailto [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/citrus-toml-merge [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/citrus-toml-merge -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/citrus-toml-merge [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/citrus-toml-merge/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/citrus-toml-merge/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/citrus-toml-merge/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/citrus-toml-merge/gemfiles/modular/cgi/vHEAD.gemfile b/gems/citrus-toml-merge/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/citrus-toml-merge/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/citrus-toml-merge/gemfiles/modular/coverage.gemfile b/gems/citrus-toml-merge/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/coverage.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/citrus-toml-merge/gemfiles/modular/coverage_local.gemfile b/gems/citrus-toml-merge/gemfiles/modular/coverage_local.gemfile index 98bc58e61..c1c13016f 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/coverage_local.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[citrus-toml-merge] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/citrus-toml-merge/gemfiles/modular/documentation.gemfile b/gems/citrus-toml-merge/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/documentation.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/citrus-toml-merge/gemfiles/modular/documentation_local.gemfile b/gems/citrus-toml-merge/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..6178e151b 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/documentation_local.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[citrus-toml-merge] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/citrus-toml-merge/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/citrus-toml-merge/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/citrus-toml-merge/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/citrus-toml-merge/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/citrus-toml-merge/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/citrus-toml-merge/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/citrus-toml-merge/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/citrus-toml-merge/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/citrus-toml-merge/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/citrus-toml-merge/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/citrus-toml-merge/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/citrus-toml-merge/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/citrus-toml-merge/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/citrus-toml-merge/gemfiles/modular/optional.gemfile b/gems/citrus-toml-merge/gemfiles/modular/optional.gemfile index a882197e1..9ea429538 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/optional.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during citrus-toml-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/citrus-toml-merge/gemfiles/modular/runtime_heads.gemfile b/gems/citrus-toml-merge/gemfiles/modular/runtime_heads.gemfile index 889fad33e..ebf17c529 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/runtime_heads.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during citrus-toml-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/citrus-toml-merge/gemfiles/modular/style.gemfile b/gems/citrus-toml-merge/gemfiles/modular/style.gemfile index 73b898465..4dbcc02c0 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/style.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during citrus-toml-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/citrus-toml-merge/gemfiles/modular/style_local.gemfile b/gems/citrus-toml-merge/gemfiles/modular/style_local.gemfile index ce75bbe21..7300ff6dd 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/style_local.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[citrus-toml-merge] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/citrus-toml-merge/gemfiles/modular/templating.gemfile b/gems/citrus-toml-merge/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/templating.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/citrus-toml-merge/gemfiles/modular/templating_local.gemfile b/gems/citrus-toml-merge/gemfiles/modular/templating_local.gemfile index 261a205a9..097c8e84b 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/templating_local.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[citrus-toml-merge] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[citrus-toml-merge] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[citrus-toml-merge] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/citrus-toml-merge/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/citrus-toml-merge/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/citrus-toml-merge/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/citrus-toml-merge/gemfiles/modular/webrick/vHEAD.gemfile b/gems/citrus-toml-merge/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/citrus-toml-merge/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/citrus-toml-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/citrus-toml-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/citrus-toml-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/citrus-toml-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/citrus-toml-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/citrus-toml-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/citrus-toml-merge/spec/fixtures_integration_spec.rb b/gems/citrus-toml-merge/spec/fixtures_integration_spec.rb index 845508dae..5871a51a9 100644 --- a/gems/citrus-toml-merge/spec/fixtures_integration_spec.rb +++ b/gems/citrus-toml-merge/spec/fixtures_integration_spec.rb @@ -124,7 +124,7 @@ def json_ready(value) [[profiles.semantic-diff.attributes]] pattern = "*.rb" - diff = "smorg-ruby" + diff = "smorg-rb" [profiles.textconv-normalized] description = "Template-only profile" @@ -150,7 +150,7 @@ def json_ready(value) expect(result.fetch(:output)).to include('diff = "smorg-rb"') expect(result.fetch(:output)).to include('description = "Destination driver"') expect(result.fetch(:output)).to include('[[profiles.textconv-normalized.attributes]]') - expect(result.fetch(:output)).not_to include('smorg-ruby') + expect(result.fetch(:output)).not_to include('smorg-rb') end it 'conforms to the provider named-suite plan and manifest-report fixtures' do diff --git a/gems/citrus-toml-merge/spec/spec_helper.rb b/gems/citrus-toml-merge/spec/spec_helper.rb index 5799adcf5..e65766c08 100644 --- a/gems/citrus-toml-merge/spec/spec_helper.rb +++ b/gems/citrus-toml-merge/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/commonmarker-merge/.kettle-drift.lock b/gems/commonmarker-merge/.kettle-drift.lock deleted file mode 100644 index aa01ca527..000000000 --- a/gems/commonmarker-merge/.kettle-drift.lock +++ /dev/null @@ -1,317 +0,0 @@ -{ - "(direct_sibling_local ||\nENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)": [ - { - "file": "Gemfile", - "lines": [ - 79, - 119, - 159, - 199, - 239, - 279, - 319, - 359 - ] - } - ], - ".find { |spec| spec.name == 'nomono' }\nnomono_locked = nomono_locked_spec &&": [ - { - "file": "Gemfile", - "lines": [ - 90, - 130, - 170, - 210, - 250, - 290, - 330, - 370 - ] - } - ], - "ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)\ndirect_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')": [ - { - "file": "Gemfile", - "lines": [ - 80, - 120, - 160, - 200, - 240, - 280, - 320, - 360 - ] - } - ], - "Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)\nnomono_activation_requirements = [\"= #{nomono_locked_spec.version}\"] if nomono_locked": [ - { - "file": "Gemfile", - "lines": [ - 92, - 132, - 172, - 212, - 252, - 292, - 332, - 372 - ] - } - ], - "Kernel.send(:gem, 'nomono', *nomono_activation_requirements)\nrequire 'nomono/bundler'": [ - { - "file": "Gemfile", - "lines": [ - 95, - 135, - 175, - 215, - 255, - 295, - 335, - 375 - ] - } - ], - "direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')\ndirect_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)": [ - { - "file": "Gemfile", - "lines": [ - 81, - 121, - 161, - 201, - 241, - 281, - 321, - 361 - ] - } - ], - "eval_nomono_gems(\ngems: direct_sibling_gems,": [ - { - "file": "Gemfile", - "lines": [ - 59, - 99, - 139, - 179, - 219, - 259, - 299, - 339, - 379 - ] - } - ], - "gems: direct_sibling_gems,\nprefix: 'STRUCTUREDMERGE',": [ - { - "file": "Gemfile", - "lines": [ - 100, - 140, - 180, - 220, - 260, - 300, - 340, - 380 - ] - } - ], - "if File.file?(nomono_lockfile)\nnomono_locked_spec = Bundler::LockfileParser": [ - { - "file": "Gemfile", - "lines": [ - 42, - 86, - 126, - 166, - 206, - 246, - 286, - 326, - 366 - ] - } - ], - "if direct_sibling_dev_was_set\nENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original": [ - { - "file": "Gemfile", - "lines": [ - 109, - 149, - 189, - 229, - 269, - 309, - 349, - 389 - ] - } - ], - "if direct_sibling_gems.any? &&\n(direct_sibling_local ||": [ - { - "file": "Gemfile", - "lines": [ - 34, - 78, - 118, - 158, - 198, - 238, - 278, - 318, - 358 - ] - } - ], - "if direct_sibling_templating && !direct_sibling_local\nif direct_sibling_dev_was_set": [ - { - "file": "Gemfile", - "lines": [ - 68, - 108, - 148, - 188, - 228, - 268, - 308, - 348, - 388 - ] - } - ], - "nomono_activation_requirements = nomono_requirements\nnomono_lockfile = File.expand_path('Gemfile.lock', __dir__)": [ - { - "file": "Gemfile", - "lines": [ - 84, - 124, - 164, - 204, - 244, - 284, - 324, - 364 - ] - } - ], - "nomono_locked = nomono_locked_spec &&\nGem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)": [ - { - "file": "Gemfile", - "lines": [ - 47, - 91, - 131, - 171, - 211, - 251, - 291, - 331, - 371 - ] - } - ], - "nomono_locked_spec = Bundler::LockfileParser\n.new(Bundler.read_file(nomono_lockfile))": [ - { - "file": "Gemfile", - "lines": [ - 43, - 87, - 127, - 167, - 207, - 247, - 287, - 327, - 367 - ] - } - ], - "nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)\nif File.file?(nomono_lockfile)": [ - { - "file": "Gemfile", - "lines": [ - 85, - 125, - 165, - 205, - 245, - 285, - 325, - 365 - ] - } - ], - "path_env: 'STRUCTUREDMERGE_DEV',\nroot: %w[src my structuredmerge]": [ - { - "file": "Gemfile", - "lines": [ - 102, - 142, - 182, - 222, - 262, - 302, - 342, - 382 - ] - } - ], - "prefix: 'STRUCTUREDMERGE',\npath_env: 'STRUCTUREDMERGE_DEV',": [ - { - "file": "Gemfile", - "lines": [ - 101, - 141, - 181, - 221, - 261, - 301, - 341, - 381 - ] - } - ], - "require 'nomono/bundler'\nENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local": [ - { - "file": "Gemfile", - "lines": [ - 96, - 136, - 176, - 216, - 256, - 296, - 336, - 376 - ] - } - ], - "rescue LoadError\nwarn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'": [ - { - "file": "Gemfile", - "lines": [ - 105, - 145, - 185, - 225, - 265, - 305, - 345, - 385 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 - ] - } - ] -} diff --git a/gems/commonmarker-merge/.rubocop_gradual.lock b/gems/commonmarker-merge/.rubocop_gradual.lock index 4c6b37486..5fd34e943 100644 --- a/gems/commonmarker-merge/.rubocop_gradual.lock +++ b/gems/commonmarker-merge/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:4284607950": [ + ".simplecov:1669031189": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:3938625005": [ @@ -21,13 +21,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -63,6 +70,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -72,10 +86,10 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], @@ -108,11 +122,11 @@ [84, 3, 1236, "Metrics/BlockLength: Block has too many lines. [30/25]", 503179966], [84, 121, 32, "Layout/LineLength: Line is too long. [152/120]", 567791365] ], - "spec/fixtures_integration_spec.rb:1689727681": [ - [3, 1, 11865, "Metrics/BlockLength: Block has too many lines. [255/25]", 1947740819], + "spec/fixtures_integration_spec.rb:1779667956": [ + [3, 1, 13039, "Metrics/BlockLength: Block has too many lines. [276/25]", 2065862761], [16, 3, 1373, "Metrics/BlockLength: Block has too many lines. [30/25]", 489033777], - [128, 3, 1353, "Metrics/BlockLength: Block has too many lines. [26/25]", 2630958569], - [211, 3, 1352, "Metrics/BlockLength: Block has too many lines. [30/25]", 2376182886], - [246, 3, 1402, "Metrics/BlockLength: Block has too many lines. [29/25]", 3678391303] + [152, 3, 1353, "Metrics/BlockLength: Block has too many lines. [26/25]", 2630958569], + [235, 3, 1352, "Metrics/BlockLength: Block has too many lines. [30/25]", 2376182886], + [270, 3, 1402, "Metrics/BlockLength: Block has too many lines. [29/25]", 3678391303] ] } diff --git a/gems/commonmarker-merge/.simplecov b/gems/commonmarker-merge/.simplecov index dfe720b1e..b67501a5b 100644 --- a/gems/commonmarker-merge/.simplecov +++ b/gems/commonmarker-merge/.simplecov @@ -4,15 +4,11 @@ # commonmarker-merge will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/commonmarker-merge/.structuredmerge/kettle-jem.yml b/gems/commonmarker-merge/.structuredmerge/kettle-jem.yml index bbb2c1cd6..ee8cba9af 100644 --- a/gems/commonmarker-merge/.structuredmerge/kettle-jem.yml +++ b/gems/commonmarker-merge/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/commonmarker/merge/version.rb - source: sig/gem.rbs diff --git a/gems/commonmarker-merge/Gemfile b/gems/commonmarker-merge/Gemfile index f297363e2..49d52ab36 100644 --- a/gems/commonmarker-merge/Gemfile +++ b/gems/commonmarker-merge/Gemfile @@ -36,300 +36,8 @@ if direct_sibling_gems.any? && ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) + require 'nomono/bundler' begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( @@ -338,8 +46,6 @@ if direct_sibling_gems.any? && path_env: 'STRUCTUREDMERGE_DEV', root: %w[src my structuredmerge] ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -351,62 +57,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -414,7 +66,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/commonmarker-merge/Gemfile.lock b/gems/commonmarker-merge/Gemfile.lock index 55e28bf0c..6c797759b 100644 --- a/gems/commonmarker-merge/Gemfile.lock +++ b/gems/commonmarker-merge/Gemfile.lock @@ -6,272 +6,6 @@ PATH markdown-merge (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,22 +16,27 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +44,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +74,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +93,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +117,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,21 +126,14 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) + markdown-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) mutex_m (0.3.0) - nokogiri (1.19.4-aarch64-linux-gnu) - racc (~> 1.4) - nokogiri (1.19.4-aarch64-linux-musl) - racc (~> 1.4) - nokogiri (1.19.4-arm64-darwin) - racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.19.4-x86_64-linux-musl) - racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +154,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +209,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +224,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +263,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -530,28 +284,22 @@ GEM ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) - service_actor (3.9.4) - zeitwerk (>= 1.0) silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +312,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +335,16 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +354,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -624,120 +381,78 @@ GEM zlib (3.2.3) PLATFORMS - aarch64-linux - aarch64-linux-gnu - aarch64-linux-musl - arm64-darwin - x86_64-darwin + x86_64-linux x86_64-linux-gnu - x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.0, >= 3.0.6) - ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! - ast-template! - bash-merge! + appraisal2-rubocop (~> 1.0, >= 1.0.0) benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! + cgi (~> 0.5) commonmarker-merge! debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.0) - go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.0, >= 2.2.25) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) + kettle-soup-cover (~> 3.0, >= 3.0.3) kettle-test (~> 2.0, >= 2.0.9) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) + standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.3) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + tree_sitter_language_pack (~> 1.13, >= 1.13.3) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 - ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -746,61 +461,43 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 - json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 - nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f - nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af - nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a - nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -818,35 +515,37 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) - service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -855,20 +554,16 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -876,8 +571,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/commonmarker-merge/LICENSE.md b/gems/commonmarker-merge/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/commonmarker-merge/LICENSE.md +++ b/gems/commonmarker-merge/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/commonmarker-merge/README.md b/gems/commonmarker-merge/README.md index e97e1bf91..38ba266f6 100644 --- a/gems/commonmarker-merge/README.md +++ b/gems/commonmarker-merge/README.md @@ -59,8 +59,8 @@ Section-local `replace_mode` / partial-template behavior still follows its own c | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -391,7 +391,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -417,6 +417,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/commonmarker-merge [⛳️namespace-img]: https://img.shields.io/badge/namespace-Commonmarker::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white @@ -461,7 +463,7 @@ If none of the available licenses suit your use case, please [contact us](mailto [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/commonmarker-merge [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/commonmarker-merge -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/commonmarker-merge [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/commonmarker-merge/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/commonmarker-merge/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/commonmarker-merge/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/commonmarker-merge/gemfiles/modular/cgi/vHEAD.gemfile b/gems/commonmarker-merge/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/commonmarker-merge/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/commonmarker-merge/gemfiles/modular/coverage.gemfile b/gems/commonmarker-merge/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/commonmarker-merge/gemfiles/modular/coverage.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/commonmarker-merge/gemfiles/modular/coverage_local.gemfile b/gems/commonmarker-merge/gemfiles/modular/coverage_local.gemfile index fcf991a8f..af5446b28 100644 --- a/gems/commonmarker-merge/gemfiles/modular/coverage_local.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[commonmarker-merge] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/commonmarker-merge/gemfiles/modular/documentation.gemfile b/gems/commonmarker-merge/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/commonmarker-merge/gemfiles/modular/documentation.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/commonmarker-merge/gemfiles/modular/documentation_local.gemfile b/gems/commonmarker-merge/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..4eb435c3c 100644 --- a/gems/commonmarker-merge/gemfiles/modular/documentation_local.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[commonmarker-merge] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/commonmarker-merge/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/commonmarker-merge/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/commonmarker-merge/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/commonmarker-merge/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/commonmarker-merge/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/commonmarker-merge/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/commonmarker-merge/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/commonmarker-merge/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/commonmarker-merge/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/commonmarker-merge/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/commonmarker-merge/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/commonmarker-merge/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/commonmarker-merge/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/commonmarker-merge/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/commonmarker-merge/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/commonmarker-merge/gemfiles/modular/optional.gemfile b/gems/commonmarker-merge/gemfiles/modular/optional.gemfile index 99a0a238e..9ea429538 100644 --- a/gems/commonmarker-merge/gemfiles/modular/optional.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during commonmarker-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/commonmarker-merge/gemfiles/modular/runtime_heads.gemfile b/gems/commonmarker-merge/gemfiles/modular/runtime_heads.gemfile index 10d179e46..ebf17c529 100644 --- a/gems/commonmarker-merge/gemfiles/modular/runtime_heads.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during commonmarker-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/commonmarker-merge/gemfiles/modular/style.gemfile b/gems/commonmarker-merge/gemfiles/modular/style.gemfile index 88acc000d..4dbcc02c0 100644 --- a/gems/commonmarker-merge/gemfiles/modular/style.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during commonmarker-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/commonmarker-merge/gemfiles/modular/style_local.gemfile b/gems/commonmarker-merge/gemfiles/modular/style_local.gemfile index ce75bbe21..8e86b91bd 100644 --- a/gems/commonmarker-merge/gemfiles/modular/style_local.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[commonmarker-merge] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/commonmarker-merge/gemfiles/modular/templating.gemfile b/gems/commonmarker-merge/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/commonmarker-merge/gemfiles/modular/templating.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/commonmarker-merge/gemfiles/modular/templating_local.gemfile b/gems/commonmarker-merge/gemfiles/modular/templating_local.gemfile index 6a0007463..83a9258e2 100644 --- a/gems/commonmarker-merge/gemfiles/modular/templating_local.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[commonmarker-merge] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[commonmarker-merge] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[commonmarker-merge] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/commonmarker-merge/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/commonmarker-merge/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/commonmarker-merge/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/commonmarker-merge/gemfiles/modular/webrick/vHEAD.gemfile b/gems/commonmarker-merge/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/commonmarker-merge/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/commonmarker-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/commonmarker-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/commonmarker-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/commonmarker-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/commonmarker-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/commonmarker-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/commonmarker-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/commonmarker-merge/spec/spec_helper.rb b/gems/commonmarker-merge/spec/spec_helper.rb index b9fa0a9f3..7e8958c35 100644 --- a/gems/commonmarker-merge/spec/spec_helper.rb +++ b/gems/commonmarker-merge/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/dotenv-merge/.kettle-drift.lock b/gems/dotenv-merge/.kettle-drift.lock deleted file mode 100644 index 09df60df7..000000000 --- a/gems/dotenv-merge/.kettle-drift.lock +++ /dev/null @@ -1,317 +0,0 @@ -{ - "(direct_sibling_local ||\nENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)": [ - { - "file": "Gemfile", - "lines": [ - 80, - 120, - 160, - 200, - 240, - 280, - 320, - 360 - ] - } - ], - ".find { |spec| spec.name == 'nomono' }\nnomono_locked = nomono_locked_spec &&": [ - { - "file": "Gemfile", - "lines": [ - 91, - 131, - 171, - 211, - 251, - 291, - 331, - 371 - ] - } - ], - "ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)\ndirect_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')": [ - { - "file": "Gemfile", - "lines": [ - 81, - 121, - 161, - 201, - 241, - 281, - 321, - 361 - ] - } - ], - "Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)\nnomono_activation_requirements = [\"= #{nomono_locked_spec.version}\"] if nomono_locked": [ - { - "file": "Gemfile", - "lines": [ - 93, - 133, - 173, - 213, - 253, - 293, - 333, - 373 - ] - } - ], - "Kernel.send(:gem, 'nomono', *nomono_activation_requirements)\nrequire 'nomono/bundler'": [ - { - "file": "Gemfile", - "lines": [ - 96, - 136, - 176, - 216, - 256, - 296, - 336, - 376 - ] - } - ], - "direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')\ndirect_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)": [ - { - "file": "Gemfile", - "lines": [ - 82, - 122, - 162, - 202, - 242, - 282, - 322, - 362 - ] - } - ], - "eval_nomono_gems(\ngems: direct_sibling_gems,": [ - { - "file": "Gemfile", - "lines": [ - 60, - 100, - 140, - 180, - 220, - 260, - 300, - 340, - 380 - ] - } - ], - "gems: direct_sibling_gems,\nprefix: 'STRUCTUREDMERGE',": [ - { - "file": "Gemfile", - "lines": [ - 101, - 141, - 181, - 221, - 261, - 301, - 341, - 381 - ] - } - ], - "if File.file?(nomono_lockfile)\nnomono_locked_spec = Bundler::LockfileParser": [ - { - "file": "Gemfile", - "lines": [ - 43, - 87, - 127, - 167, - 207, - 247, - 287, - 327, - 367 - ] - } - ], - "if direct_sibling_dev_was_set\nENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original": [ - { - "file": "Gemfile", - "lines": [ - 110, - 150, - 190, - 230, - 270, - 310, - 350, - 390 - ] - } - ], - "if direct_sibling_gems.any? &&\n(direct_sibling_local ||": [ - { - "file": "Gemfile", - "lines": [ - 35, - 79, - 119, - 159, - 199, - 239, - 279, - 319, - 359 - ] - } - ], - "if direct_sibling_templating && !direct_sibling_local\nif direct_sibling_dev_was_set": [ - { - "file": "Gemfile", - "lines": [ - 69, - 109, - 149, - 189, - 229, - 269, - 309, - 349, - 389 - ] - } - ], - "nomono_activation_requirements = nomono_requirements\nnomono_lockfile = File.expand_path('Gemfile.lock', __dir__)": [ - { - "file": "Gemfile", - "lines": [ - 85, - 125, - 165, - 205, - 245, - 285, - 325, - 365 - ] - } - ], - "nomono_locked = nomono_locked_spec &&\nGem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)": [ - { - "file": "Gemfile", - "lines": [ - 48, - 92, - 132, - 172, - 212, - 252, - 292, - 332, - 372 - ] - } - ], - "nomono_locked_spec = Bundler::LockfileParser\n.new(Bundler.read_file(nomono_lockfile))": [ - { - "file": "Gemfile", - "lines": [ - 44, - 88, - 128, - 168, - 208, - 248, - 288, - 328, - 368 - ] - } - ], - "nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)\nif File.file?(nomono_lockfile)": [ - { - "file": "Gemfile", - "lines": [ - 86, - 126, - 166, - 206, - 246, - 286, - 326, - 366 - ] - } - ], - "path_env: 'STRUCTUREDMERGE_DEV',\nroot: %w[src my structuredmerge]": [ - { - "file": "Gemfile", - "lines": [ - 103, - 143, - 183, - 223, - 263, - 303, - 343, - 383 - ] - } - ], - "prefix: 'STRUCTUREDMERGE',\npath_env: 'STRUCTUREDMERGE_DEV',": [ - { - "file": "Gemfile", - "lines": [ - 102, - 142, - 182, - 222, - 262, - 302, - 342, - 382 - ] - } - ], - "require 'nomono/bundler'\nENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local": [ - { - "file": "Gemfile", - "lines": [ - 97, - 137, - 177, - 217, - 257, - 297, - 337, - 377 - ] - } - ], - "rescue LoadError\nwarn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'": [ - { - "file": "Gemfile", - "lines": [ - 106, - 146, - 186, - 226, - 266, - 306, - 346, - 386 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 - ] - } - ] -} diff --git a/gems/dotenv-merge/.rubocop_gradual.lock b/gems/dotenv-merge/.rubocop_gradual.lock index 238683cd4..3228da656 100644 --- a/gems/dotenv-merge/.rubocop_gradual.lock +++ b/gems/dotenv-merge/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:811436142": [ + ".simplecov:1840448245": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:3735002317": [ @@ -8,9 +8,10 @@ [163, 121, 22, "Layout/LineLength: Line is too long. [142/120]", 1367093088], [166, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 3881946477] ], - "dotenv-merge.gemspec:3219964147": [ + "dotenv-merge.gemspec:588032134": [ [125, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 2821357214], - [133, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 981994949] + [136, 121, 50, "Layout/LineLength: Line is too long. [170/120]", 3888612416], + [137, 121, 29, "Layout/LineLength: Line is too long. [149/120]", 981994949] ], "gemfiles/modular/benchmark/r4/v0.5.gemfile:3644720371": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] @@ -19,13 +20,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -61,6 +69,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -70,10 +85,10 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], @@ -103,34 +118,26 @@ [315, 7, 908, "Metrics/MethodLength: Method has too many lines. [18/10]", 3290540918], [315, 7, 908, "Metrics/PerceivedComplexity: Perceived complexity for `integrate_freeze_blocks` is too high. [11/8]", 3290540918] ], - "lib/dotenv/merge/smart_merger.rb:4110302585": [ - [27, 5, 20190, "Metrics/ClassLength: Class has too many lines. [398/100]", 2164846336], - [52, 7, 1092, "Metrics/MethodLength: Method has too many lines. [16/10]", 2908064588], - [52, 21, 401, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [13/5]", 1661881927], - [126, 7, 2338, "Metrics/AbcSize: Assignment Branch Condition size for `perform_merge` is too high. [<17, 42, 7> 45.85/17]", 2431495447], - [126, 7, 2338, "Metrics/MethodLength: Method has too many lines. [49/10]", 2431495447], - [235, 7, 733, "Metrics/MethodLength: Method has too many lines. [11/10]", 3293257138], - [260, 7, 331, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `apply_node_typing` is too high. [8/7]", 1465922549], - [272, 7, 680, "Metrics/MethodLength: Method has too many lines. [11/10]", 4253249620], - [300, 7, 602, "Metrics/MethodLength: Method has too many lines. [12/10]", 1142282607], - [364, 7, 1110, "Metrics/AbcSize: Assignment Branch Condition size for `root_boundary_lines_for` is too high. [<7, 29, 24> 38.29/17]", 3853137527], - [364, 7, 1110, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `root_boundary_lines_for` is too high. [22/7]", 3853137527], - [364, 7, 1110, "Metrics/MethodLength: Method has too many lines. [21/10]", 3853137527], - [364, 7, 1110, "Metrics/PerceivedComplexity: Perceived complexity for `root_boundary_lines_for` is too high. [21/8]", 3853137527], - [392, 7, 732, "Metrics/AbcSize: Assignment Branch Condition size for `emission_start_line_for` is too high. [<4, 17, 10> 20.12/17]", 2147944725], - [392, 7, 732, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emission_start_line_for` is too high. [9/7]", 2147944725], - [392, 7, 732, "Metrics/MethodLength: Method has too many lines. [12/10]", 2147944725], - [392, 7, 732, "Metrics/PerceivedComplexity: Perceived complexity for `emission_start_line_for` is too high. [10/8]", 2147944725], - [413, 7, 1134, "Metrics/MethodLength: Method has too many lines. [15/10]", 3700686114], - [413, 25, 239, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 406985461], - [440, 7, 712, "Metrics/MethodLength: Method has too many lines. [13/10]", 3393691510], - [506, 7, 1797, "Metrics/AbcSize: Assignment Branch Condition size for `collapse_cross_source_preamble_prefixes` is too high. [<14, 21, 9> 26.8/17]", 3130187278], - [506, 7, 1797, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `collapse_cross_source_preamble_prefixes` is too high. [9/7]", 3130187278], - [506, 7, 1797, "Metrics/MethodLength: Method has too many lines. [31/10]", 3130187278], - [506, 7, 1797, "Metrics/PerceivedComplexity: Perceived complexity for `collapse_cross_source_preamble_prefixes` is too high. [9/8]", 3130187278], - [546, 7, 536, "Metrics/MethodLength: Method has too many lines. [15/10]", 4188914818] - ], - "spec/dotenv/merge/comment_behavior_matrix_spec.rb:4260851990": [ + "lib/dotenv/merge/smart_merger.rb:1416653553": [ + [27, 5, 19504, "Metrics/ClassLength: Class has too many lines. [379/100]", 1271421201], + [53, 7, 1092, "Metrics/MethodLength: Method has too many lines. [16/10]", 2908064588], + [53, 21, 401, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [13/5]", 1661881927], + [127, 7, 2338, "Metrics/AbcSize: Assignment Branch Condition size for `perform_merge` is too high. [<17, 42, 7> 45.85/17]", 2431495447], + [127, 7, 2338, "Metrics/MethodLength: Method has too many lines. [49/10]", 2431495447], + [237, 7, 733, "Metrics/MethodLength: Method has too many lines. [11/10]", 3293257138], + [262, 7, 331, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `apply_node_typing` is too high. [8/7]", 1465922549], + [274, 7, 680, "Metrics/MethodLength: Method has too many lines. [11/10]", 4253249620], + [302, 7, 707, "Metrics/MethodLength: Method has too many lines. [13/10]", 657590111], + [386, 7, 1134, "Metrics/MethodLength: Method has too many lines. [15/10]", 3700686114], + [386, 25, 239, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [7/5]", 406985461], + [469, 7, 1797, "Metrics/AbcSize: Assignment Branch Condition size for `collapse_cross_source_preamble_prefixes` is too high. [<14, 21, 9> 26.8/17]", 3130187278], + [469, 7, 1797, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `collapse_cross_source_preamble_prefixes` is too high. [9/7]", 3130187278], + [469, 7, 1797, "Metrics/MethodLength: Method has too many lines. [31/10]", 3130187278], + [469, 7, 1797, "Metrics/PerceivedComplexity: Perceived complexity for `collapse_cross_source_preamble_prefixes` is too high. [9/8]", 3130187278], + [509, 7, 536, "Metrics/MethodLength: Method has too many lines. [15/10]", 4188914818], + [537, 121, 2, "Layout/LineLength: Line is too long. [122/120]", 5861122] + ], + "spec/dotenv/merge/comment_behavior_matrix_spec.rb:3919059317": [ [13, 37, 15, "Style/SymbolProc: Pass `&:value` as an argument to `lambda` instead of a block.", 1808354951], [19, 121, 72, "Layout/LineLength: Line is too long. [192/120]", 727266440], [20, 121, 81, "Layout/LineLength: Line is too long. [201/120]", 2338882412], diff --git a/gems/dotenv-merge/.simplecov b/gems/dotenv-merge/.simplecov index d19d8f8ae..c52abed5a 100644 --- a/gems/dotenv-merge/.simplecov +++ b/gems/dotenv-merge/.simplecov @@ -4,15 +4,11 @@ # dotenv-merge will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/dotenv-merge/.structuredmerge/kettle-jem.yml b/gems/dotenv-merge/.structuredmerge/kettle-jem.yml index 2fdedc239..6950419f1 100644 --- a/gems/dotenv-merge/.structuredmerge/kettle-jem.yml +++ b/gems/dotenv-merge/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/dotenv/merge/version.rb - source: sig/gem.rbs diff --git a/gems/dotenv-merge/Gemfile b/gems/dotenv-merge/Gemfile index 65f59a20f..896f87567 100644 --- a/gems/dotenv-merge/Gemfile +++ b/gems/dotenv-merge/Gemfile @@ -37,300 +37,8 @@ if direct_sibling_gems.any? && ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) + require 'nomono/bundler' begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( @@ -339,8 +47,6 @@ if direct_sibling_gems.any? && path_env: 'STRUCTUREDMERGE_DEV', root: %w[src my structuredmerge] ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -352,62 +58,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -415,7 +67,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/dotenv-merge/Gemfile.lock b/gems/dotenv-merge/Gemfile.lock index cd091eb7c..e69528854 100644 --- a/gems/dotenv-merge/Gemfile.lock +++ b/gems/dotenv-merge/Gemfile.lock @@ -6,272 +6,6 @@ PATH tree_haver (= 7.1.0) version_gem (~> 1.1, >= 1.1.14) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,22 +16,26 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +43,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +73,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +92,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +116,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,7 +125,6 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) mutex_m (0.3.0) nokogiri (1.19.4-aarch64-linux-gnu) racc (~> 1.4) @@ -398,13 +132,11 @@ GEM racc (~> 1.4) nokogiri (1.19.4-arm64-darwin) racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-musl) racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +157,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +212,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +227,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +266,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -530,28 +287,22 @@ GEM ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) - service_actor (3.9.4) - zeitwerk (>= 1.0) silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +315,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +338,20 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-aarch64-linux) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-arm64-darwin) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +361,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -628,116 +392,78 @@ PLATFORMS aarch64-linux-gnu aarch64-linux-musl arm64-darwin - x86_64-darwin + x86_64-linux x86_64-linux-gnu x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.2, >= 3.2.0) - ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! - ast-template! - bash-merge! + appraisal2-rubocop (~> 1.0, >= 1.0.0) benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! - commonmarker-merge! + cgi (~> 0.5) debug (>= 1.1) dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.4) - go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.3, >= 2.3.7) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) - kettle-test (~> 2.0, >= 2.0.11) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kettle-soup-cover (~> 3.0, >= 3.0.3) + kettle-test (~> 2.0, >= 2.0.12) + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) - stone_checksums (~> 1.0, >= 1.0.6, >= 1.0.3) + standard (~> 1.56, >= 1.56.0) + stone_checksums (~> 1.0, >= 1.0.6) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! + tree_sitter_language_pack (~> 1.13, >= 1.13.3) turbo_tests2 (~> 3.2, >= 3.2.0) - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 - ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 @@ -747,61 +473,46 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 - json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 - markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -819,35 +530,37 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) - service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -856,20 +569,18 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-aarch64-linux) sha256=55ffc7c87868cb45658338363d9eba51b4a8b0259aa88e4de368d2bd1d52fea4 + tree_sitter_language_pack (1.13.3-arm64-darwin) sha256=bc2498db605f212a1dbd2465ed3f65190d7da786f6ed5d30fcf958121aeb4a5c + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -877,8 +588,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/dotenv-merge/LICENSE.md b/gems/dotenv-merge/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/dotenv-merge/LICENSE.md +++ b/gems/dotenv-merge/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/dotenv-merge/README.md b/gems/dotenv-merge/README.md index 8c8d767f7..8946d5ee5 100644 --- a/gems/dotenv-merge/README.md +++ b/gems/dotenv-merge/README.md @@ -72,8 +72,8 @@ File.write("merged.env", result.to_s) | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -255,7 +255,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -281,6 +281,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/dotenv-merge [⛳️namespace-img]: https://img.shields.io/badge/namespace-Dotenv::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white @@ -325,7 +327,7 @@ If none of the available licenses suit your use case, please [contact us](mailto [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/dotenv-merge [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/dotenv-merge -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/dotenv-merge [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/dotenv-merge/dotenv-merge.gemspec b/gems/dotenv-merge/dotenv-merge.gemspec index c57163a6e..0a1c8406a 100644 --- a/gems/dotenv-merge/dotenv-merge.gemspec +++ b/gems/dotenv-merge/dotenv-merge.gemspec @@ -123,13 +123,17 @@ Gem::Specification.new do |spec| # Testing spec.add_development_dependency('appraisal2', '~> 3.2', '>= 3.2.0') # ruby >= 1.8.7, for testing against multiple versions of dependencies - spec.add_development_dependency('kettle-test', '~> 2.0', '>= 2.0.11') # ruby >= 4.0.0 + spec.add_development_dependency('kettle-test', '~> 2.0', '>= 2.0.12') # ruby >= 4.0.0 spec.add_development_dependency('turbo_tests2', '~> 3.2', '>= 3.2.0') # ruby >= 2.4.0, default kettle-test runner # Releasing spec.add_development_dependency('ruby-progressbar', '~> 1.13') # ruby >= 0 spec.add_development_dependency('stone_checksums', '~> 1.0', '>= 1.0.6') # ruby >= 2.2.0 + # Development tasks + # The cake is a lie. erb v2.2, the oldest release, was never compatible with Ruby 2.3. + # This means we have no choice but to use the erb that shipped with Ruby 2.3 + # /opt/hostedtoolcache/Ruby/2.3.8/x64/lib/ruby/gems/2.3.0/gems/erb-2.2.2/lib/erb.rb:670:in `prepare_trim_mode': undefined method `match?' for "-":String (NoMethodError) # spec.add_development_dependency("erb", ">= 2.2") # ruby >= 2.3.0, not SemVer, old rubies get dropped in a patch. spec.add_development_dependency('gitmoji-regex', '~> 2.0', '>= 2.0.4') # ruby >= 2.4 end diff --git a/gems/dotenv-merge/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/dotenv-merge/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/dotenv-merge/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/dotenv-merge/gemfiles/modular/cgi/vHEAD.gemfile b/gems/dotenv-merge/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/dotenv-merge/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/dotenv-merge/gemfiles/modular/coverage.gemfile b/gems/dotenv-merge/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/dotenv-merge/gemfiles/modular/coverage.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/dotenv-merge/gemfiles/modular/coverage_local.gemfile b/gems/dotenv-merge/gemfiles/modular/coverage_local.gemfile index 42978107b..b2acaef20 100644 --- a/gems/dotenv-merge/gemfiles/modular/coverage_local.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[dotenv-merge] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/dotenv-merge/gemfiles/modular/documentation.gemfile b/gems/dotenv-merge/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/dotenv-merge/gemfiles/modular/documentation.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/dotenv-merge/gemfiles/modular/documentation_local.gemfile b/gems/dotenv-merge/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..c02fbb6fe 100644 --- a/gems/dotenv-merge/gemfiles/modular/documentation_local.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[dotenv-merge] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/dotenv-merge/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/dotenv-merge/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/dotenv-merge/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/dotenv-merge/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/dotenv-merge/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/dotenv-merge/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/dotenv-merge/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/dotenv-merge/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/dotenv-merge/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/dotenv-merge/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/dotenv-merge/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/dotenv-merge/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/dotenv-merge/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/dotenv-merge/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/dotenv-merge/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/dotenv-merge/gemfiles/modular/optional.gemfile b/gems/dotenv-merge/gemfiles/modular/optional.gemfile index 7893db4ec..9ea429538 100644 --- a/gems/dotenv-merge/gemfiles/modular/optional.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during dotenv-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/dotenv-merge/gemfiles/modular/runtime_heads.gemfile b/gems/dotenv-merge/gemfiles/modular/runtime_heads.gemfile index 3b75162dc..ebf17c529 100644 --- a/gems/dotenv-merge/gemfiles/modular/runtime_heads.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during dotenv-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/dotenv-merge/gemfiles/modular/style.gemfile b/gems/dotenv-merge/gemfiles/modular/style.gemfile index 325fe5d0f..4dbcc02c0 100644 --- a/gems/dotenv-merge/gemfiles/modular/style.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during dotenv-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/dotenv-merge/gemfiles/modular/style_local.gemfile b/gems/dotenv-merge/gemfiles/modular/style_local.gemfile index ce75bbe21..e5dd1c6d0 100644 --- a/gems/dotenv-merge/gemfiles/modular/style_local.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[dotenv-merge] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/dotenv-merge/gemfiles/modular/templating.gemfile b/gems/dotenv-merge/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/dotenv-merge/gemfiles/modular/templating.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/dotenv-merge/gemfiles/modular/templating_local.gemfile b/gems/dotenv-merge/gemfiles/modular/templating_local.gemfile index 926fc36d5..82acb636f 100644 --- a/gems/dotenv-merge/gemfiles/modular/templating_local.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[dotenv-merge] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[dotenv-merge] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[dotenv-merge] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/dotenv-merge/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/dotenv-merge/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/dotenv-merge/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/dotenv-merge/gemfiles/modular/webrick/vHEAD.gemfile b/gems/dotenv-merge/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/dotenv-merge/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/dotenv-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/dotenv-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/dotenv-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/dotenv-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/dotenv-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/dotenv-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/dotenv-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/dotenv-merge/lib/dotenv/merge/smart_merger.rb b/gems/dotenv-merge/lib/dotenv/merge/smart_merger.rb index 6480674e7..e89e4d959 100644 --- a/gems/dotenv-merge/lib/dotenv/merge/smart_merger.rb +++ b/gems/dotenv-merge/lib/dotenv/merge/smart_merger.rb @@ -26,6 +26,7 @@ module Merge # preference: { default: :destination, secret: :template }) class SmartMerger < ::Ast::Merge::SmartMergerBase include Ast::Merge::TrailingGroups::DestIterate + include Ast::Merge::CommentLayoutEmissionSupport attr_reader :corruption_handling @@ -224,6 +225,7 @@ def process_match(template_stmt, dest_stmt) when :template emit_template_preferred_match(template_stmt, dest_stmt) else + add_retained_leading_gap(dest_stmt, @dest_analysis, decision: MergeResult::DECISION_DESTINATION) @result.add_raw(node_lines_for(dest_stmt, @dest_analysis), decision: MergeResult::DECISION_DESTINATION) end end @@ -300,6 +302,7 @@ def process_dest_only(dest_stmt, _dest_index) def emit_template_preferred_match(template_stmt, dest_stmt) comment_source_node, comment_source_analysis = preferred_comment_source_for(template_stmt, dest_stmt) inline_comment = preferred_inline_comment_for(template_stmt, dest_stmt) + add_retained_leading_gap(dest_stmt, @dest_analysis, decision: MergeResult::DECISION_DESTINATION) @result.add_raw( node_lines_for( template_stmt, @@ -362,48 +365,18 @@ def emit_root_boundary(kind) end def root_boundary_lines_for(kind, analysis) - owners = Array(analysis.structural_owners).select do |owner| - owner.respond_to?(:start_line) && owner.respond_to?(:end_line) && owner.start_line && owner.end_line - end - - if kind == :preamble && owners.empty? && analysis.respond_to?(:lines) && analysis.lines.any? - return analysis.lines.map(&:raw) - end - return [] if owners.empty? - - case kind - when :preamble - first_owner = owners.min_by(&:start_line) - start_line = emission_start_line_for(first_owner, analysis) - return [] unless start_line && start_line > 1 - - (1...start_line).filter_map { |line_number| raw_line_at(analysis, line_number) } - when :postlude - last_line = owners.map(&:end_line).compact.max - return [] unless last_line && analysis.respond_to?(:lines) - return [] if last_line >= analysis.lines.length - - ((last_line + 1)..analysis.lines.length).filter_map { |line_number| raw_line_at(analysis, line_number) } - else - [] - end + super(kind, analysis, owners: analysis.structural_owners, fallback_to_owner_bounds: true) end def emission_start_line_for(node, analysis) - attachment = analysis.comment_attachment_for(node) - leading_region = attachment&.leading_region - start_line = if leading_region&.start_line - leading_region.start_line - elsif first_structural_owner?(node, - analysis) && analysis.comment_augmenter.preamble_region&.start_line - analysis.comment_augmenter.preamble_region.start_line - else - node.start_line - end - - start_line -= 1 while start_line > 1 && raw_line_at(analysis, start_line - 1).to_s.strip.empty? + region_start = region_start_line(leading_region_for(node, analysis)) + preamble_start = analysis.comment_augmenter.preamble_region&.start_line if first_structural_owner?(node, + analysis) + preceding_blank_line_start(region_start || preamble_start || node.start_line, analysis) + end - start_line + def root_boundary_owner_start_line_for(node, analysis) + emission_start_line_for(node, analysis) end def first_structural_owner?(node, analysis) @@ -437,40 +410,30 @@ def node_lines_for( leading_lines + apply_inline_comment(node_lines, inline_comment) + trailing_lines end - def removed_destination_comment_lines_for(node) - lines = leading_segment_lines_for(node, @dest_analysis) - attachment = @dest_analysis.comment_attachment_for(node) + def add_retained_leading_gap(node, analysis, decision:) + lines = retained_owner_leading_gap_lines_for(node, analysis, owners: analysis.structural_owners) + return if lines.empty? - if (inline_comment = destination_inline_comment_for(node)) - lines << promoted_inline_comment_line_for(node, @dest_analysis, inline_comment) - end + @result.add_raw(lines, decision: decision) + end - if (trailing_region = attachment&.trailing_region) - lines.concat(trailing_region.text.split("\n")) - end + def removed_destination_comment_lines_for(node) + inline_lines = [] - trailing_gap = attachment&.trailing_gap - if trailing_gap && trailing_gap.effective_controller_side(removed_owners: [node]) == :after - lines.concat(trailing_gap.lines) + if (inline_comment = destination_inline_comment_for(node)) + inline_lines << promoted_inline_comment_line_for(node, @dest_analysis, inline_comment) end - lines.compact - end - - def leading_segment_lines_for(node, analysis) - start_line = emission_start_line_for(node, analysis) - return [] unless start_line && start_line < node.start_line - - (start_line...node.start_line).filter_map { |line_number| raw_line_at(analysis, line_number) } + removed_owner_preserved_lines_for( + node, + @dest_analysis, + owners: @dest_analysis.structural_owners, + inline_lines: inline_lines + ) end def interstitial_trailing_segment_lines_for(node, analysis) - return [] unless next_structural_owner_for(node, analysis) - - trailing_region = analysis.comment_attachment_for(node)&.trailing_region - return [] unless trailing_region - - trailing_region.text.split("\n") + interstitial_trailing_region_lines_for(node, analysis, owners: analysis.structural_owners) end def next_structural_owner_for(node, analysis) @@ -569,6 +532,17 @@ def raw_line_at(analysis, line_number) line = analysis.line_at(line_number) line.respond_to?(:raw) ? line.raw : line end + + def leading_segment_anchor_line_for(node, analysis, owners: nil, leading_region: nil) + region_start = super(node, analysis, owners: owners || analysis.structural_owners, leading_region: leading_region) + preamble_start = analysis.comment_augmenter.preamble_region&.start_line if first_structural_owner?(node, + analysis) + region_start || preamble_start + end + + def source_line_at(analysis, line_number) + raw_line_at(analysis, line_number) + end end end end diff --git a/gems/dotenv-merge/spec/dotenv/merge/comment_behavior_matrix_spec.rb b/gems/dotenv-merge/spec/dotenv/merge/comment_behavior_matrix_spec.rb index 6b4a56ec9..0ece3d726 100644 --- a/gems/dotenv-merge/spec/dotenv/merge/comment_behavior_matrix_spec.rb +++ b/gems/dotenv-merge/spec/dotenv/merge/comment_behavior_matrix_spec.rb @@ -24,5 +24,7 @@ }, expected_literal_hash_value: 'literal # hash' ) + + it_behaves_like 'Ast::Merge::RetainedBlankGapCompliance' end end diff --git a/gems/dotenv-merge/spec/spec_helper.rb b/gems/dotenv-merge/spec/spec_helper.rb index 7fc927ff7..8380347f3 100644 --- a/gems/dotenv-merge/spec/spec_helper.rb +++ b/gems/dotenv-merge/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/go-merge/.kettle-drift.lock b/gems/go-merge/.kettle-drift.lock deleted file mode 100644 index 09df60df7..000000000 --- a/gems/go-merge/.kettle-drift.lock +++ /dev/null @@ -1,317 +0,0 @@ -{ - "(direct_sibling_local ||\nENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)": [ - { - "file": "Gemfile", - "lines": [ - 80, - 120, - 160, - 200, - 240, - 280, - 320, - 360 - ] - } - ], - ".find { |spec| spec.name == 'nomono' }\nnomono_locked = nomono_locked_spec &&": [ - { - "file": "Gemfile", - "lines": [ - 91, - 131, - 171, - 211, - 251, - 291, - 331, - 371 - ] - } - ], - "ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)\ndirect_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')": [ - { - "file": "Gemfile", - "lines": [ - 81, - 121, - 161, - 201, - 241, - 281, - 321, - 361 - ] - } - ], - "Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)\nnomono_activation_requirements = [\"= #{nomono_locked_spec.version}\"] if nomono_locked": [ - { - "file": "Gemfile", - "lines": [ - 93, - 133, - 173, - 213, - 253, - 293, - 333, - 373 - ] - } - ], - "Kernel.send(:gem, 'nomono', *nomono_activation_requirements)\nrequire 'nomono/bundler'": [ - { - "file": "Gemfile", - "lines": [ - 96, - 136, - 176, - 216, - 256, - 296, - 336, - 376 - ] - } - ], - "direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')\ndirect_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)": [ - { - "file": "Gemfile", - "lines": [ - 82, - 122, - 162, - 202, - 242, - 282, - 322, - 362 - ] - } - ], - "eval_nomono_gems(\ngems: direct_sibling_gems,": [ - { - "file": "Gemfile", - "lines": [ - 60, - 100, - 140, - 180, - 220, - 260, - 300, - 340, - 380 - ] - } - ], - "gems: direct_sibling_gems,\nprefix: 'STRUCTUREDMERGE',": [ - { - "file": "Gemfile", - "lines": [ - 101, - 141, - 181, - 221, - 261, - 301, - 341, - 381 - ] - } - ], - "if File.file?(nomono_lockfile)\nnomono_locked_spec = Bundler::LockfileParser": [ - { - "file": "Gemfile", - "lines": [ - 43, - 87, - 127, - 167, - 207, - 247, - 287, - 327, - 367 - ] - } - ], - "if direct_sibling_dev_was_set\nENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original": [ - { - "file": "Gemfile", - "lines": [ - 110, - 150, - 190, - 230, - 270, - 310, - 350, - 390 - ] - } - ], - "if direct_sibling_gems.any? &&\n(direct_sibling_local ||": [ - { - "file": "Gemfile", - "lines": [ - 35, - 79, - 119, - 159, - 199, - 239, - 279, - 319, - 359 - ] - } - ], - "if direct_sibling_templating && !direct_sibling_local\nif direct_sibling_dev_was_set": [ - { - "file": "Gemfile", - "lines": [ - 69, - 109, - 149, - 189, - 229, - 269, - 309, - 349, - 389 - ] - } - ], - "nomono_activation_requirements = nomono_requirements\nnomono_lockfile = File.expand_path('Gemfile.lock', __dir__)": [ - { - "file": "Gemfile", - "lines": [ - 85, - 125, - 165, - 205, - 245, - 285, - 325, - 365 - ] - } - ], - "nomono_locked = nomono_locked_spec &&\nGem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)": [ - { - "file": "Gemfile", - "lines": [ - 48, - 92, - 132, - 172, - 212, - 252, - 292, - 332, - 372 - ] - } - ], - "nomono_locked_spec = Bundler::LockfileParser\n.new(Bundler.read_file(nomono_lockfile))": [ - { - "file": "Gemfile", - "lines": [ - 44, - 88, - 128, - 168, - 208, - 248, - 288, - 328, - 368 - ] - } - ], - "nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)\nif File.file?(nomono_lockfile)": [ - { - "file": "Gemfile", - "lines": [ - 86, - 126, - 166, - 206, - 246, - 286, - 326, - 366 - ] - } - ], - "path_env: 'STRUCTUREDMERGE_DEV',\nroot: %w[src my structuredmerge]": [ - { - "file": "Gemfile", - "lines": [ - 103, - 143, - 183, - 223, - 263, - 303, - 343, - 383 - ] - } - ], - "prefix: 'STRUCTUREDMERGE',\npath_env: 'STRUCTUREDMERGE_DEV',": [ - { - "file": "Gemfile", - "lines": [ - 102, - 142, - 182, - 222, - 262, - 302, - 342, - 382 - ] - } - ], - "require 'nomono/bundler'\nENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local": [ - { - "file": "Gemfile", - "lines": [ - 97, - 137, - 177, - 217, - 257, - 297, - 337, - 377 - ] - } - ], - "rescue LoadError\nwarn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'": [ - { - "file": "Gemfile", - "lines": [ - 106, - 146, - 186, - 226, - 266, - 306, - 346, - 386 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 - ] - } - ] -} diff --git a/gems/go-merge/.rubocop_gradual.lock b/gems/go-merge/.rubocop_gradual.lock index bb6039651..821942cf3 100644 --- a/gems/go-merge/.rubocop_gradual.lock +++ b/gems/go-merge/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:203349166": [ + ".simplecov:495473973": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:522749197": [ @@ -15,13 +15,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -57,6 +64,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -66,10 +80,10 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], @@ -82,21 +96,21 @@ "lib/go-merge.rb:1938991181": [ [1, 1, 0, "Naming/FileName: The name of this source file (`go-merge.rb`) should use snake_case.", 5381] ], - "lib/go/merge.rb:547557749": [ + "lib/go/merge.rb:1429248778": [ [10, 3, 12, "Style/Documentation: Missing top-level documentation comment for `module Go::Merge`.", 2866359175], - [10, 3, 7242, "Metrics/ModuleLength: Module has too many lines. [173/100]", 2713105462], + [10, 3, 8162, "Metrics/ModuleLength: Module has too many lines. [191/100]", 1602270489], [11, 5, 11, "Style/ModuleFunction: Use `module_function` instead of `extend self`.", 1210897631], - [72, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1491828652], - [79, 5, 1399, "Metrics/AbcSize: Assignment Branch Condition size for `merge_go` is too high. [<13, 32, 11> 36.25/17]", 3471957286], - [79, 5, 1399, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `merge_go` is too high. [11/7]", 3471957286], - [79, 5, 1399, "Metrics/MethodLength: Method has too many lines. [22/10]", 3471957286], - [79, 5, 1399, "Metrics/PerceivedComplexity: Perceived complexity for `merge_go` is too high. [11/8]", 3471957286], - [98, 34, 7, "Style/MultilineBlockChain: Avoid multi-line chains of blocks.", 4045560504], - [106, 5, 1419, "Metrics/AbcSize: Assignment Branch Condition size for `analyze_go_module` is too high. [<8, 19, 5> 21.21/17]", 525883462], - [106, 5, 1419, "Metrics/MethodLength: Method has too many lines. [40/10]", 525883462] - ], - "spec/fixtures_integration_spec.rb:2854818786": [ - [3, 1, 4677, "Metrics/BlockLength: Block has too many lines. [66/25]", 420437002], + [74, 121, 20, "Layout/LineLength: Line is too long. [140/120]", 1491828652], + [102, 5, 1399, "Metrics/AbcSize: Assignment Branch Condition size for `merge_go` is too high. [<13, 32, 11> 36.25/17]", 3471957286], + [102, 5, 1399, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `merge_go` is too high. [11/7]", 3471957286], + [102, 5, 1399, "Metrics/MethodLength: Method has too many lines. [22/10]", 3471957286], + [102, 5, 1399, "Metrics/PerceivedComplexity: Perceived complexity for `merge_go` is too high. [11/8]", 3471957286], + [121, 34, 7, "Style/MultilineBlockChain: Avoid multi-line chains of blocks.", 4045560504], + [129, 5, 1447, "Metrics/AbcSize: Assignment Branch Condition size for `analyze_go_module` is too high. [<8, 19, 5> 21.21/17]", 1720548769], + [129, 5, 1447, "Metrics/MethodLength: Method has too many lines. [40/10]", 1720548769] + ], + "spec/fixtures_integration_spec.rb:341155994": [ + [3, 1, 5172, "Metrics/BlockLength: Block has too many lines. [76/25]", 420437002], [8, 3, 4420, "Metrics/BlockLength: Block has too many lines. [61/25]", 566085077] ] } diff --git a/gems/go-merge/.simplecov b/gems/go-merge/.simplecov index 5cedb0d75..72d10562d 100644 --- a/gems/go-merge/.simplecov +++ b/gems/go-merge/.simplecov @@ -4,15 +4,11 @@ # go-merge will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/go-merge/.structuredmerge/kettle-jem.yml b/gems/go-merge/.structuredmerge/kettle-jem.yml index 30b2f752d..8b545db6c 100644 --- a/gems/go-merge/.structuredmerge/kettle-jem.yml +++ b/gems/go-merge/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/go/merge/version.rb - source: sig/gem.rbs diff --git a/gems/go-merge/Gemfile b/gems/go-merge/Gemfile index 46680094a..19ef45e61 100644 --- a/gems/go-merge/Gemfile +++ b/gems/go-merge/Gemfile @@ -37,300 +37,8 @@ if direct_sibling_gems.any? && ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) + require 'nomono/bundler' begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( @@ -339,8 +47,6 @@ if direct_sibling_gems.any? && path_env: 'STRUCTUREDMERGE_DEV', root: %w[src my structuredmerge] ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -352,62 +58,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -415,7 +67,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/go-merge/Gemfile.lock b/gems/go-merge/Gemfile.lock index 83023846e..64cafdafc 100644 --- a/gems/go-merge/Gemfile.lock +++ b/gems/go-merge/Gemfile.lock @@ -6,272 +6,6 @@ PATH tree_haver (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,22 +16,26 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +43,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +73,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +92,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +116,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,7 +125,6 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) mutex_m (0.3.0) nokogiri (1.19.4-aarch64-linux-gnu) racc (~> 1.4) @@ -398,13 +132,11 @@ GEM racc (~> 1.4) nokogiri (1.19.4-arm64-darwin) racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-musl) racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +157,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +212,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +227,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +266,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -530,28 +287,22 @@ GEM ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) - service_actor (3.9.4) - zeitwerk (>= 1.0) silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +315,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +338,20 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-aarch64-linux) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-arm64-darwin) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +361,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -628,116 +392,77 @@ PLATFORMS aarch64-linux-gnu aarch64-linux-musl arm64-darwin - x86_64-darwin + x86_64-linux x86_64-linux-gnu x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.0, >= 3.0.6) - ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! - ast-template! - bash-merge! + appraisal2-rubocop (~> 1.0, >= 1.0.0) benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! - commonmarker-merge! + cgi (~> 0.5) debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.0) go-merge! irb (~> 1.17) - json-merge! kettle-dev (~> 2.0, >= 2.2.25) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) + kettle-soup-cover (~> 3.0, >= 3.0.3) kettle-test (~> 2.0, >= 2.0.9) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) + standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.3) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + tree_sitter_language_pack (~> 1.13, >= 1.13.3) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 - ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -746,7 +471,7 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f @@ -755,52 +480,38 @@ CHECKSUMS io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 - json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 - markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -818,35 +529,37 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) - service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -855,20 +568,18 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-aarch64-linux) sha256=55ffc7c87868cb45658338363d9eba51b4a8b0259aa88e4de368d2bd1d52fea4 + tree_sitter_language_pack (1.13.3-arm64-darwin) sha256=bc2498db605f212a1dbd2465ed3f65190d7da786f6ed5d30fcf958121aeb4a5c + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -876,8 +587,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/go-merge/LICENSE.md b/gems/go-merge/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/go-merge/LICENSE.md +++ b/gems/go-merge/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/go-merge/README.md b/gems/go-merge/README.md index 46fa466cc..ec0a11e8f 100644 --- a/gems/go-merge/README.md +++ b/gems/go-merge/README.md @@ -36,8 +36,8 @@ I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-ta | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -155,7 +155,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -181,6 +181,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/go-merge [⛳️namespace-img]: https://img.shields.io/badge/namespace-Go::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white @@ -225,7 +227,7 @@ If none of the available licenses suit your use case, please [contact us](mailto [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/go-merge [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/go-merge -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/go-merge [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/go-merge/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/go-merge/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/go-merge/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/go-merge/gemfiles/modular/cgi/vHEAD.gemfile b/gems/go-merge/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/go-merge/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/go-merge/gemfiles/modular/coverage.gemfile b/gems/go-merge/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/go-merge/gemfiles/modular/coverage.gemfile +++ b/gems/go-merge/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/go-merge/gemfiles/modular/coverage_local.gemfile b/gems/go-merge/gemfiles/modular/coverage_local.gemfile index 4f8dd92a4..d25a83ee8 100644 --- a/gems/go-merge/gemfiles/modular/coverage_local.gemfile +++ b/gems/go-merge/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[go-merge] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/go-merge/gemfiles/modular/documentation.gemfile b/gems/go-merge/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/go-merge/gemfiles/modular/documentation.gemfile +++ b/gems/go-merge/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/go-merge/gemfiles/modular/documentation_local.gemfile b/gems/go-merge/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..6397c466b 100644 --- a/gems/go-merge/gemfiles/modular/documentation_local.gemfile +++ b/gems/go-merge/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[go-merge] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/go-merge/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/go-merge/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/go-merge/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/go-merge/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/go-merge/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/go-merge/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/go-merge/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/go-merge/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/go-merge/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/go-merge/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/go-merge/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/go-merge/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/go-merge/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/go-merge/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/go-merge/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/go-merge/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/go-merge/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/go-merge/gemfiles/modular/optional.gemfile b/gems/go-merge/gemfiles/modular/optional.gemfile index ca08b46e1..9ea429538 100644 --- a/gems/go-merge/gemfiles/modular/optional.gemfile +++ b/gems/go-merge/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during go-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/go-merge/gemfiles/modular/runtime_heads.gemfile b/gems/go-merge/gemfiles/modular/runtime_heads.gemfile index 353bc7997..ebf17c529 100644 --- a/gems/go-merge/gemfiles/modular/runtime_heads.gemfile +++ b/gems/go-merge/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during go-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/go-merge/gemfiles/modular/style.gemfile b/gems/go-merge/gemfiles/modular/style.gemfile index 6fbe829c7..4dbcc02c0 100644 --- a/gems/go-merge/gemfiles/modular/style.gemfile +++ b/gems/go-merge/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during go-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/go-merge/gemfiles/modular/style_local.gemfile b/gems/go-merge/gemfiles/modular/style_local.gemfile index ce75bbe21..dc482c6b6 100644 --- a/gems/go-merge/gemfiles/modular/style_local.gemfile +++ b/gems/go-merge/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[go-merge] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/go-merge/gemfiles/modular/templating.gemfile b/gems/go-merge/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/go-merge/gemfiles/modular/templating.gemfile +++ b/gems/go-merge/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/go-merge/gemfiles/modular/templating_local.gemfile b/gems/go-merge/gemfiles/modular/templating_local.gemfile index 847d5acc2..c4029e234 100644 --- a/gems/go-merge/gemfiles/modular/templating_local.gemfile +++ b/gems/go-merge/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[go-merge] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[go-merge] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[go-merge] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/go-merge/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/go-merge/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/go-merge/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/go-merge/gemfiles/modular/webrick/vHEAD.gemfile b/gems/go-merge/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/go-merge/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/go-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/go-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/go-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/go-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/go-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/go-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/go-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/go-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/go-merge/lib/go/merge.rb b/gems/go-merge/lib/go/merge.rb index 0d7bb1be6..74eef0065 100644 --- a/gems/go-merge/lib/go/merge.rb +++ b/gems/go-merge/lib/go/merge.rb @@ -37,8 +37,8 @@ def available_go_backends end def go_backend_feature_profile(backend: nil) - requested = backend.to_s.empty? ? TREE_SITTER_BACKEND.id : backend.to_s - unless requested == TREE_SITTER_BACKEND.id && go_backend_available_for_analysis?(requested) + requested = requested_tree_sitter_backend_id(backend) + unless go_backend_available_for_analysis?(requested) return unsupported_feature_result("Unsupported Go backend #{requested}.") end @@ -64,9 +64,9 @@ def go_plan_context(backend: nil) end def parse_go(source, dialect) - requested = TREE_SITTER_BACKEND.id - unless requested == TREE_SITTER_BACKEND.id && go_backend_available_for_analysis?(requested) - return unsupported_feature_result("Unsupported Go backend #{requested}.") + unless go_backend_available_for_analysis?(nil) + diagnostic_backend = TreeHaver.current_backend_id || 'tree-sitter' + return unsupported_feature_result("Unsupported Go backend #{diagnostic_backend}.") end return analyze_go_module(source) if dialect == 'go' @@ -76,11 +76,24 @@ def parse_go(source, dialect) def go_backend_available_for_analysis?(backend_id) register_backend! - return false unless backend_id.to_s == TREE_SITTER_BACKEND.id - registrations = TreeHaver.registered_languages(:go) - registrations.key?(:tree_sitter) || registrations.key?(:tslp) + if backend_id.to_s.empty? + TreeHaver.parser_for(:go, backend_type: :tree_sitter) + else + TreeHaver.with_backend(backend_id) { TreeHaver.parser_for(:go, backend_type: :tree_sitter) } + end + true + rescue TreeHaver::Error, ArgumentError + false + end + + def requested_tree_sitter_backend_id(backend) + return backend.to_s unless backend.to_s.empty? + + contextual = TreeHaver.current_backend_id || ENV['TREE_HAVER_BACKEND'] + contextual.to_s.empty? || contextual.to_s == 'auto' ? TREE_SITTER_BACKEND.id : contextual.to_s end + private_class_method :requested_tree_sitter_backend_id def match_go_owners(template, destination) Ast::Merge::OwnerSelection.match_by_path(template, destination) @@ -114,7 +127,7 @@ def merge_go(template_source, destination_source, dialect) end def analyze_go_module(source) - parser = TreeHaver.parser_for(:go) + parser = TreeHaver.parser_for(:go, backend_type: :tree_sitter) tree = parser.parse(source) collect_parse_errors(tree.root_node) diff --git a/gems/go-merge/spec/fixtures_integration_spec.rb b/gems/go-merge/spec/fixtures_integration_spec.rb index de2520faa..730d19a57 100644 --- a/gems/go-merge/spec/fixtures_integration_spec.rb +++ b/gems/go-merge/spec/fixtures_integration_spec.rb @@ -86,7 +86,7 @@ def json_ready(value) = Ast::Merge.json_ready(value) expect(result[:ok]).to be(false) expect(result[:diagnostics]).to eq( [{ severity: 'error', category: 'unsupported_feature', - message: 'Unsupported Go backend kreuzberg-language-pack.' }] + message: 'Unsupported Go backend tree-sitter.' }] ) end end diff --git a/gems/go-merge/spec/spec_helper.rb b/gems/go-merge/spec/spec_helper.rb index 84a49676f..519a48b5d 100644 --- a/gems/go-merge/spec/spec_helper.rb +++ b/gems/go-merge/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/html-merge/.gitattributes b/gems/html-merge/.gitattributes new file mode 100644 index 000000000..35a3c7359 --- /dev/null +++ b/gems/html-merge/.gitattributes @@ -0,0 +1,5 @@ +# <> do not edit below this line +*.rb diff=smorg-rb +*.go diff=smorg-go +*.rs diff=smorg-rs +# <> diff --git a/gems/html-merge/.github/workflows/main.yml b/gems/html-merge/.github/workflows/main.yml new file mode 100644 index 000000000..34fcca6f0 --- /dev/null +++ b/gems/html-merge/.github/workflows/main.yml @@ -0,0 +1,32 @@ +name: Ruby + +on: + push: + branches: + - main + + pull_request: + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + name: Ruby ${{ matrix.ruby }} + strategy: + matrix: + ruby: + - '4.0.6' + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - name: Set up Ruby + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 + with: + ruby-version: ${{ matrix.ruby }} + bundler-cache: true + - name: Run the default task + run: bundle exec rake diff --git a/gems/html-merge/.gitignore b/gems/html-merge/.gitignore new file mode 100644 index 000000000..b04a8c840 --- /dev/null +++ b/gems/html-merge/.gitignore @@ -0,0 +1,11 @@ +/.bundle/ +/.yardoc +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ + +# rspec failure tracking +.rspec_status diff --git a/gems/html-merge/.rspec b/gems/html-merge/.rspec new file mode 100644 index 000000000..34c5164d9 --- /dev/null +++ b/gems/html-merge/.rspec @@ -0,0 +1,3 @@ +--format documentation +--color +--require spec_helper diff --git a/gems/html-merge/.rubocop.yml b/gems/html-merge/.rubocop.yml new file mode 100644 index 000000000..ae378d09c --- /dev/null +++ b/gems/html-merge/.rubocop.yml @@ -0,0 +1,8 @@ +AllCops: + TargetRubyVersion: 3.2 + +Style/StringLiterals: + EnforcedStyle: double_quotes + +Style/StringLiteralsInInterpolation: + EnforcedStyle: double_quotes diff --git a/gems/html-merge/.structuredmerge/kettle-jem.yml b/gems/html-merge/.structuredmerge/kettle-jem.yml new file mode 100644 index 000000000..f1cbd8854 --- /dev/null +++ b/gems/html-merge/.structuredmerge/kettle-jem.yml @@ -0,0 +1,521 @@ +# kettle-jem configuration file +# +# This file is both configuration and field guide for templated gems. +# In most projects this comment block is the first place to look when you +# want to understand what kettle-jem will merge, what it will copy as-is, +# and which values you may want to customize. +# +# High-level structure: +# defaults - default merge behavior for files that use strategy: merge +# tokens - values for {KJ|...} placeholders used across template files +# patterns - glob-based overrides for files/directories +# files - exact per-file overrides using a nested directory tree +# +# Default behavior: +# If a file is NOT mentioned under files: and does NOT match a patterns: +# entry, kettle-jem will merge it using the format-aware merge gem for that +# file type. +# +# Strategies: +# merge: +# Resolve tokens, then merge template + destination using the appropriate +# AST-aware/text-aware merger for the file type. +# accept_template: +# Resolve tokens, then write the template result without merging. +# If the file is missing in the destination, it will be created from the template. +# keep_destination: +# Ignore this file during templating. +# No merge. No replacement. No creation when the destination file is missing. +# Use this when you want to permanently exclude a file from the template. +# raw_copy: +# Copy bytes exactly as they appear in the template. +# No token resolution. No merge. Use for immutable/binary assets such as certs. +# +# Merge options (used only with strategy: merge): +# preference: +# template - template wins when both sides define the same node/value +# destination - destination wins when both sides define the same node/value +# add_template_only_nodes: +# true - add nodes/entries that exist only in the template +# false - do not add template-only nodes +# freeze_token: +# Marker name used for frozen sections (default: kettle-jem) +# file_type: +# Optional explicit merge-engine hint for extensionless or ambiguous files. +# Supported values: ruby, gemfile, appraisals, gemspec, rakefile, +# yaml, markdown, text, json, jsonc, toml, dotenv, rbs +# Runtime-gated values requiring provider availability: bash +# max_recursion_depth: +# Limit for recursive merging when a merger supports it +# +# Other per-file options (apply to any strategy): +# skip_unresolved_scan: +# true - do not scan this file for unresolved {KJ|...} tokens after writing. +# Use when a file legitimately contains {KJ|...} text as documentation +# or example content rather than as a template placeholder. +# +# Token values: +# Precedence is: +# 1) ENV variables. During templating, known ENV-backed values are also +# written back into this file so config and runtime agree. +# 2) tokens: values in this file +# 3) safe automatic derivation (author fields only, where possible) +# +# Safe automatic derivations currently implemented: +# AUTHOR:NAME <- first author from the gemspec +# AUTHOR:NAMES <- all authors from the gemspec, or copyright holders if no gemspec authors exist +# AUTHOR:EMAIL <- first email from the gemspec +# AUTHOR:DOMAIN <- domain part of AUTHOR:EMAIL +# AUTHOR:GIVEN_NAMES <- AUTHOR:NAME minus the last word +# AUTHOR:FAMILY_NAMES <- last word of AUTHOR:NAME +# +# Everything else should be set explicitly here or via ENV. + +# This project's identifying emoji. +# Used as the leading emoji in the README H1 heading and in the gemspec +# summary and description. Every gem should have its own unique emoji. +# +# Set this to a single emoji that represents your gem. Examples: 🪙 🔑 🛠️ 🔮 +# This key is REQUIRED. kettle-jem will abort if it is absent. +# ENV override: KJ_PROJECT_EMOJI +project_emoji: 💎 + +# Engines this project supports. +# List the Ruby engines that your gem targets. kettle-jem uses this to decide +# which CI workflows, README compatibility rows, and badge references to +# include. Engines not listed here are pruned from generated files. +# +# Supported values: ruby, jruby, truffleruby +# Default (when key is absent): all three engines. +engines: + - ruby + - jruby + - truffleruby + +# Ruby version policy. +ruby: + # Lowest MRI Ruby version for generated CI workflows, Appraisals, and + # test/development dependency assumptions. This is intentionally separate + # from the gemspec required_ruby_version, which describes the published + # runtime contract. Effective CI minimum is max(gemspec minimum, this value). + test_minimum: "3.2.0" + +# RubyGems packaging/runtime shape. +rubygems: + # Published runtime Ruby floor used for generated gemspec metadata and README + # compatibility text. Omit this to derive the value from the gemspec. + min_ruby: "3.2.0" + +# RubyGems package manifest additions. +# The generated gemspec owns the default package manifest. Add entries here only +# for package/runtime files that are not covered by the template default. +# +# Example: +# gemspec: +# package_files: +# include: +# - data/**/*.json + +# Repository URL topology. +# This is independent from templates.profile. A gem may use the full template +# while still living as a sub-project inside a monorepo. +# +# Supported values: +# standalone - project URLs point at this gem's own repository +# monorepo-subproject - project URLs point at a subdirectory in the repository root +# +# ENV override: KJ_REPOSITORY_TOPOLOGY +repository: + topology: "monorepo-subproject" + +# Framework matrix workflows. +# When your gem tests against multiple versions of a framework (Rails, +# ActiveRecord, ActiveSupport, etc.), this section configures how +# kettle-jem generates the CI matrix strategy and gemfile references. +# +# preset: controls overall workflow strategy +# modern — Ruby-only matrix (default when absent) +# framework — Ruby × framework-version matrix +# legacy-compat — supported / unsupported / ancient workflow split +# +# framework_matrix (only used when preset: framework): +# dimension — framework name used in the matrix key and display +# (e.g. activerecord, rails, actionmailer) +# gem — gem name to write into generated framework gemfiles. +# Defaults to dimension when absent. +# versions — ordered list of versions to test against. Entries may be +# strings, or mappings with: +# label - display value used in CI +# slug - path-safe value used in gemfile_pattern +# requirement - Bundler requirement written to the gemfile +# gemfile_pattern — pattern for gemfile paths; {version} is replaced +# with each version slug (dots replaced by underscores +# when the pattern contains an underscore placeholder). +# Resolved relative to gemfiles/ unless it already contains +# a directory. +# Examples: +# "ar-{version}.x" → gemfiles/ar-7.0.x +# "rails_{version}" → gemfiles/rails_7_0.gemfile +# Use this when you need a simple 2D matrix: Ruby × one framework gem/version axis. +# For deeper or more complex matrices that are better modeled as Appraisals entries, +# prefer kettle-jem-appraisals instead. +# +workflows: + # Default command used by generated test workflows. + # ENV override: KJ_EXEC_CMD + exec_cmd: kettle-test + # Include VCR/WebMock recording modular gemfiles in generated Appraisals. + # Enable only for projects that actually require recording support. + recording: false + # preset: framework + # framework_matrix: + # dimension: activerecord + # gem: activerecord + # versions: + # - "7.0" + # - "7.1" + # - "7.2" + # - label: "8.0+" + # slug: "8_0_plus" + # requirement: ">= 8.0" + # gemfile_pattern: "ar-{version}.x" + +# Project-level third-party integrations. +# Disabling an integration removes its upload/check action, suppresses its +# README badges, skips templating its packaged config/workflow, and cleans up +# matching config files or workflows if they already exist. +# +# Supported coverage integrations: codecov, coveralls, qlty +# Supported license-check integration: skywalking-eyes +# skywalking-eyes defaults to disabled unless the configured licenses include +# MIT. Set `skywalking-eyes: true` to opt in for other license sets. +# +# Examples: +# integrations: +# qlty: false +# skywalking-eyes: false +# disabled: +# - codecov +# - coveralls + +# README top logos. +# Comma-separated list of optional logo entries for the generated README header. +# top_logos render above the title; h2_synopsis_logos render inline with the Synopsis H2. +# Supported values: related-org, ruby, org, project, optionally followed by |width. +# Examples: org|12%, ruby|96px +# Default widths: top 1 logo => 14%, top 2 logos => 12%, Synopsis 1 logo => 10%, Synopsis 2 logos => 8%. +# Default (when keys are absent): top_logos: org,project; h2_synopsis_logos: related-org,ruby +# Legacy top_logo_mode values map as: +# org => related-org,ruby,org +# project => related-org,ruby,project +# org_and_project => related-org,ruby,org,project +readme: + top_logos: org + h2_synopsis_logos: related-org,ruby + # Optional package-family README block. + # Supported values: structuredmerge + # Leave unset for standalone kettle-rb gems and most projects. + # package_family: structuredmerge + # Sections to preserve from the destination README during template merging. + # These section headings (case-insensitive) will keep the destination body + # instead of being overwritten by the template. Default when absent: + # - synopsis + # - configuration + # - basic usage + # + # Built-in aliases (destination → template): + # summary → synopsis, usage → basic usage, + # configuration options → configuration, setup → basic usage + # + # preserve_sections: + # - synopsis + # - configuration + # - basic usage + # - usage + # - summary + # + # Glob patterns for additional sections to preserve (e.g. Note:* headings). + # Default when absent: ["note:*"] + # + # preserve_patterns: + # - "note:*" + # - "setup*" + # + # Custom section aliases (destination heading → canonical template heading). + # Merged with built-in aliases above. + # + # section_aliases: + # howto: basic usage + # options: configuration + # README badges managed by the template. + badges: + # FOSSA license/security status badge. + # false - omit the badge (default) + # true - derive project id from the GitHub repository slug + # string or mapping project/project_id/slug - explicit FOSSA project id + # + # Example: + # fossa: git+github.com/pboling/example + fossa: false + +# SPDX license identifiers for this project. +# List one or more licenses that apply to the gem. Users may use the software +# under the terms of any one license listed here (OR semantics, not AND). +# +# Accepted values (initial supported set): +# MIT - MIT License (open source, permissive) +# AGPL-3.0-only - GNU Affero General Public License v3 +# PolyForm-Noncommercial-1.0.0 - PolyForm Noncommercial License 1.0.0 +# PolyForm-Small-Business-1.0.0 - PolyForm Small Business License 1.0.0 +# LicenseRef-Big-Time-Public-License - Big Time Public License 2.0.2 +# +# Defaults to spec.licenses from the gemspec when this key is absent. +# +# Template behaviour: +# - Each listed license is copied as .md into the project. +# - A LICENSE.md index file is generated referencing all chosen licenses. +# - Any non-MIT license adds a "contact for commercial license" prompt. +# - When MIT (or AGPL), a PolyForm variant, AND LicenseRef-Big-Time-Public-License +# are all present, a use-case guide table is added to README and LICENSE.md. +licenses: + - MIT +license_eye: + dependency_licenses: + - name: simplecov-rcov + version: 0.3.7 + license: MIT + +# Machine / automation accounts to exclude from generated copyright output. +# +# When kettle-jem collects copyright information via `git blame`, it filters +# out known GitHub/GitLab bot accounts automatically. Use this list to also +# exclude internal automation accounts that are not bots in the git sense +# (i.e. they do not follow the "[bot]" naming convention). +# +# Each entry is matched case-insensitively against the commit author name AND +# the commit author email, so you can list either form. +# +# Default (when key is absent or empty): ["autobolt"] +machine_users: + - autobolt + +# Self-test / templating CI threshold. +# Set to a number from 0 to 100 to fail `rake kettle:jem:selftest` once +# divergence exceeds that percent. Leave blank to report only. +# Divergence is currently measured as the percent of produced files that would +# change or be added during templating (100 - unchanged-file score). +# ENV override: KJ_MIN_DIVERGENCE_THRESHOLD +min_divergence_threshold: + +# Hostname used for generated YARD documentation links. +# Defaults to .. +# ENV override: KJ_YARD_HOST +yard_host: "html-merge.galtzo.com" + +# Full URL used for gemspec metadata["homepage_uri"]. +# Defaults to https://html-merge.galtzo.com. +# ENV override: KJ_HOMEPAGE_URI +homepage_uri: "https://structuredmerge.org" + +# Template source inventory. +# The packaged inventory is the canonical kettle-jem project template. It +# includes the detailed GitHub Actions workflow set, modular gemfiles, +# README badges, license files, config files, and support scripts. +templates: + root: packaged + apply: true + entries: + - README.md + - source: gem.gemspec + target: html-merge.gemspec + - LICENSE.md + - MIT.md + - AGPL-3.0-only.md + - PolyForm-Noncommercial-1.0.0.md + - PolyForm-Small-Business-1.0.0.md + - Big-Time-Public-License.md + - Gemfile + - certs/pboling.pem + - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile + - source: lib/gem/version.rb + target: lib/html/merge/version.rb + - source: sig/gem.rbs + target: sig/html/merge.rbs + # Template recipe profile. + # Supported values: + # full - full gem template + # monorepo-subgem - smaller sub-project template + # monorepo-root - repository-root support template + # + # ENV override: KETTLE_JEM_TEMPLATE_PROFILE + profile: monorepo-subgem-package + +# StructuredMerge Git diff driver setup. +# Default: semantic-diff installs local .gitattributes entries for semantic +# structured diffs. Use builtin-diff to retain Git's built-in language drivers, +# global to register driver commands in user config, include-file to write +# .git/smorg/config, check to verify setup, undo to remove managed entries, or +# none to opt out. +# ENV override: KETTLE_JEM_GIT_DRIVERS +git_drivers: semantic-diff + +# Optional kettle-jem plugins. +# Each entry is a gem name. During bootstrap, kettle-jem ensures each plugin is +# added as a development dependency so it is available after bin/setup. +# During bundled templating, kettle-jem requires the plugin and calls +# `register_kettle_jem_plugin(registrar)` on its top-level handle. +# +# Phase callback names currently available: +# - config_sync +# - dev_container +# - github_workflows +# - quality_config +# - modular_gemfiles +# - spec_helper +# - environment_templates +# - remaining_files +# - git_hooks +# - license_files +# - duplicate_check +# +# Phase guarantees: +# - All plugin callbacks run during the bundled templating phase, after +# bin/setup and bundle install have completed. +# - kettle-jem, kettle-dev, and any plugin gems listed here are loadable. +# - kettle-jem's parser / merger runtime is available to callbacks. +# - `remaining_files` runs after the destination Rakefile, gemspec, README, +# and most template-managed files already exist on disk. +# - `duplicate_check` runs last, after all template writes are complete. +plugins: + - kettle-drift + +# Default merge options +defaults: + preference: "template" + add_template_only_nodes: true + freeze_token: "kettle-jem" + +# Token replacement values. +# +# General rules: +# - Empty strings are treated as unset. +# - Use the bare identifier/slug/handle expected by the inline comment. +# - Do NOT paste full URLs unless the comment explicitly says to. +# +# Tip: +# The author fields in a newly created destination config are normally seeded +# from the gemspec via safe derivation. After that, destination values win. +tokens: + forge: + gh_user: "pboling" # GitHub username only, no @, no URL. Used for GitHub Sponsors and profile links. ENV: KJ_GH_USER + gl_user: "pboling" # GitLab username only, no @, no URL. Used for profile links. ENV: KJ_GL_USER + cb_user: "pboling" # Codeberg username only, no @, no URL. Used for profile links. ENV: KJ_CB_USER + sh_user: "galtzo" # SourceHut username only, no leading ~, no URL. Used as https://sr.ht/~/. ENV: KJ_SH_USER + + author: + name: "Peter H. Boling" # Full display name. Example: Ada Lovelace. ENV: KJ_AUTHOR_NAME. Auto-seeded from gemspec authors.first; generated gemspec authors preserve the full existing authors array via AUTHOR:NAMES. + given_names: "Peter H." # Given/personal names only. Example: Ada. ENV: KJ_AUTHOR_GIVEN_NAMES. Auto-seeded when AUTHOR:NAME can be split + family_names: "Boling" # Family/surname only. Example: Lovelace. ENV: KJ_AUTHOR_FAMILY_NAMES. Auto-seeded when AUTHOR:NAME can be split + email: "floss@galtzo.com" # Primary public email address. Example: floss@galtzo.com. ENV: KJ_AUTHOR_EMAIL. Auto-seeded from gemspec email.first + domain: "galtzo.com" # Bare domain only, no scheme, no email. Example: galtzo.com. ENV: KJ_AUTHOR_DOMAIN. Auto-seeded from AUTHOR:EMAIL + orcid: "0009-0008-8519-441X" # ORCID identifier only, not the full URL. Example: 0000-0001-2345-6789. ENV: KJ_AUTHOR_ORCID + + funding: + open_collective: "galtzo-floss" # Open Collective slug, true to enable with ENV/.opencollective.yml, false to disable. ENV: OPENCOLLECTIVE_HANDLE or FUNDING_ORG + kofi: "pboling" # Ko-fi handle/slug only. Used as https://ko-fi.com/. ENV: KJ_FUNDING_KOFI + paypal: "peterboling" # PayPal.Me slug only. Used as https://www.paypal.com/paypalme/. ENV: KJ_FUNDING_PAYPAL + buymeacoffee: "pboling" # Buy Me a Coffee slug only. Used as https://www.buymeacoffee.com/. ENV: KJ_FUNDING_BUYMEACOFFEE + liberapay: "pboling" # Liberapay account slug only. Used as https://liberapay.com//donate. ENV: KJ_FUNDING_LIBERAPAY + + social: + mastodon: "galtzo" # Local handle only for the instance assumed by the template link. Current template uses https://ruby.social/@. ENV: KJ_SOCIAL_MASTODON + bluesky: "galtzo.com" # Full Bluesky handle. Example: peterboling.dev or alice.bsky.social. Used as https://bsky.app/profile/. ENV: KJ_SOCIAL_BLUESKY + linktree: "galtzo" # Linktree username only. Used as https://linktr.ee/. ENV: KJ_SOCIAL_LINKTREE + devto: "galtzo" # DEV Community username only. Used as https://dev.to/. ENV: KJ_SOCIAL_DEVTO + +# Glob patterns evaluated in order (first match wins) +patterns: + - path: "certs/**" + strategy: raw_copy + - path: ".github/workflows/**" + strategy: accept_template + +# Per-file configuration (nested directory structure) +# Only files that need overrides belong here. Everything else defaults to merge. +files: + README.md: + strategy: merge + html-merge.gemspec: + strategy: keep_destination + AGENTS.md: + strategy: accept_template + Appraisal.root.gemfile: + strategy: accept_template + Gemfile: + strategy: accept_template + Rakefile: + strategy: merge + preference: destination + add_template_only_nodes: true + .github: + copilot_instructions.md: + strategy: accept_template + gemfiles: + modular: + templating.gemfile: + strategy: accept_template + templating_local.gemfile: + strategy: accept_template diff --git a/gems/html-merge/CHANGELOG.md b/gems/html-merge/CHANGELOG.md new file mode 100644 index 000000000..19b941db5 --- /dev/null +++ b/gems/html-merge/CHANGELOG.md @@ -0,0 +1,5 @@ +## [Unreleased] + +## [0.1.0] - 2026-07-19 + +- Initial release diff --git a/gems/html-merge/CODE_OF_CONDUCT.md b/gems/html-merge/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..9258d8d56 --- /dev/null +++ b/gems/html-merge/CODE_OF_CONDUCT.md @@ -0,0 +1,10 @@ +# Code of Conduct + +"html-merge" follows [The Ruby Community Conduct Guideline](https://www.ruby-lang.org/en/conduct) in all "collaborative space", which is defined as community communications channels (such as mailing lists, submitted patches, commit comments, etc.): + +* Participants will be tolerant of opposing views. +* Participants must ensure that their language and actions are free of personal attacks and disparaging personal remarks. +* When interpreting the words and actions of others, participants should always assume good intentions. +* Behaviour which can be reasonably considered harassment will not be tolerated. + +If you have any concerns about behaviour within this project, please contact us at ["peter.boling@gmail.com"](mailto:"peter.boling@gmail.com"). diff --git a/gems/html-merge/Gemfile b/gems/html-merge/Gemfile new file mode 100644 index 000000000..ab14b3aaa --- /dev/null +++ b/gems/html-merge/Gemfile @@ -0,0 +1,84 @@ +# frozen_string_literal: true + +# kettle-jem:freeze +# To retain chunks of comments & code during kettle-jem templating: +# Wrap custom sections with freeze markers (e.g., as above and below this comment chunk). +# kettle-jem will then preserve content between those markers across template runs. +# kettle-jem:unfreeze + +source "https://gem.coop" + +git_source(:codeberg) { |repo_name| "https://codeberg.org/#{repo_name}" } +git_source(:gitlab) { |repo_name| "https://gitlab.com/#{repo_name}" } + +#### IMPORTANT ####################################################### +# Gemfile is for local development ONLY; Gemfile is NOT loaded in CI # +####################################################### IMPORTANT #### + +# Include dependencies from html-merge.gemspec +gemspec + +# Local workspace dependency wiring for *_local.gemfile overrides +nomono_requirements = ["~> 1.0", ">= 1.0.8"] +gem "nomono", *nomono_requirements, require: false # ruby >= 2.2 + +# Direct sibling dependencies (env-switched via STRUCTUREDMERGE_DEV) +direct_sibling_gems = %w[ + ast-merge + ast-crispr + tree_haver +] +direct_sibling_dev = ENV.fetch("STRUCTUREDMERGE_DEV", "") +direct_sibling_local = + !direct_sibling_dev.empty? && !%w[false 0 no off].include?(direct_sibling_dev.downcase) +direct_sibling_templating = ENV.fetch("K_JEM_TEMPLATING", "false").casecmp("true").zero? + +if direct_sibling_gems.any? && + (direct_sibling_local || + ENV.fetch("K_JEM_TEMPLATING", "false").casecmp("true").zero?) + direct_sibling_dev_was_set = ENV.key?("STRUCTUREDMERGE_DEV") + direct_sibling_dev_original = ENV.fetch("STRUCTUREDMERGE_DEV", nil) + require "nomono/bundler" + begin + ENV["STRUCTUREDMERGE_DEV"] = File.expand_path("..", __dir__) if direct_sibling_templating && !direct_sibling_local + + eval_nomono_gems( + gems: direct_sibling_gems, + prefix: "STRUCTUREDMERGE", + path_env: "STRUCTUREDMERGE_DEV", + root: ["src", "my", "structuredmerge"] + ) + ensure + if direct_sibling_templating && !direct_sibling_local + if direct_sibling_dev_was_set + ENV["STRUCTUREDMERGE_DEV"] = direct_sibling_dev_original + else + ENV.delete("STRUCTUREDMERGE_DEV") + end + end + end +end + +# Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) +eval_gemfile "gemfiles/modular/templating.gemfile" if ENV.fetch("K_JEM_TEMPLATING", "false").casecmp("true").zero? + +# Debugging +eval_gemfile "gemfiles/modular/debug.gemfile" + +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) +eval_gemfile "gemfiles/modular/coverage.gemfile" + +# Linting +eval_gemfile "gemfiles/modular/style.gemfile" + +# Documentation +eval_gemfile "gemfiles/modular/documentation.gemfile" + +# Optional +eval_gemfile "gemfiles/modular/optional.gemfile" + +### Std Lib Extracted Gems +eval_gemfile "gemfiles/modular/x_std_libs.gemfile" + +# See unlocked_deps appraisal for more details on irb inclusion +gem "irb", "~> 1.17" # ruby >= 2.7 diff --git a/gems/html-merge/Gemfile.lock b/gems/html-merge/Gemfile.lock new file mode 100644 index 000000000..85a63258c --- /dev/null +++ b/gems/html-merge/Gemfile.lock @@ -0,0 +1,476 @@ +PATH + remote: . + specs: + html-merge (7.1.0) + ast-crispr (= 7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) + +GEM + remote: https://gem.coop/ + specs: + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + ansi (1.6.0) + appraisal2 (3.2.0) + bundler (>= 1.17.3) + rake (>= 10) + thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) + ast (2.4.3) + ast-crispr (7.1.0) + ast-merge (= 7.1.0) + service_actor (~> 3.9) + version_gem (~> 1.1, >= 1.1.9) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) + benchmark (0.5.0) + bigdecimal (4.1.2) + cgi (0.5.2) + citrus (3.0.2) + cmdparse (3.0.7) + concurrent-ruby (1.3.8) + date (3.5.1) + debug (1.11.1) + irb (~> 1.10) + reline (>= 0.3.8) + diff-lcs (1.6.2) + diffy (3.4.4) + dry-configurable (1.4.0) + dry-core (~> 1.0) + zeitwerk (~> 2.6) + dry-core (1.2.0) + concurrent-ruby (~> 1.0) + logger + zeitwerk (~> 2.6) + dry-inflector (1.3.1) + dry-initializer (3.2.0) + dry-logic (1.6.0) + bigdecimal + concurrent-ruby (~> 1.0) + dry-core (~> 1.1) + zeitwerk (~> 2.6) + dry-schema (1.16.0) + concurrent-ruby (~> 1.0) + dry-configurable (~> 1.0, >= 1.0.1) + dry-core (~> 1.1) + dry-initializer (~> 3.2) + dry-logic (~> 1.6) + dry-types (~> 1.9, >= 1.9.1) + zeitwerk (~> 2.6) + dry-types (1.9.1) + bigdecimal (>= 3.0) + concurrent-ruby (~> 1.0) + dry-core (~> 1.0) + dry-inflector (~> 1.0) + dry-logic (~> 1.4) + zeitwerk (~> 2.6) + erb (6.0.6) + gem_bench (2.0.5) + bundler (>= 1.14) + version_gem (~> 1.1, >= 1.1.4) + geom2d (0.4.1) + hexapdf (1.9.1) + cmdparse (~> 3.0, >= 3.0.3) + geom2d (~> 0.4, >= 0.4.1) + openssl (>= 2.2.1) + strscan (>= 3.1.2) + io-console (0.8.2) + irb (1.18.0) + pp (>= 0.6.0) + prism (>= 1.3.0) + rdoc (>= 4.0.0) + reline (>= 0.4.2) + json (2.21.1) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) + simplecov-rcov (~> 0.3, >= 0.3.7) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) + kramdown (2.5.2) + rexml (>= 3.4.4) + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + language_server-protocol (3.17.0.6) + lint_roller (1.1.0) + logger (1.7.0) + mutex_m (0.3.0) + nokogiri (1.19.4-x86_64-linux-gnu) + racc (~> 1.4) + nomono (1.1.0) + openssl (4.0.2) + ostruct (0.6.3) + parallel (1.28.0) + parser (3.3.12.0) + ast (~> 2.4.1) + racc + parslet (2.0.0) + pp (0.6.4) + prettyprint + prettyprint (0.2.0) + prism (1.9.0) + psych (5.4.0) + date + stringio + public_suffix (7.0.5) + racc (1.8.1) + rainbow (3.1.1) + rake (13.4.2) + rbs (4.0.3) + logger + prism (>= 1.6.0) + tsort + rdoc (6.17.0) + erb + psych (>= 4.0.0) + tsort + reek (6.5.0) + dry-schema (~> 1.13) + logger (~> 1.6) + parser (~> 3.3.0) + rainbow (>= 2.0, < 4.0) + rexml (~> 3.1) + regexp_parser (2.12.0) + reline (0.6.3) + io-console (~> 0.5) + rexml (3.4.4) + rubocop (1.88.2) + json (~> 2.3) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) + parallel (>= 1.10) + parser (>= 3.3.0.2) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.49.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.50.0) + parser (>= 3.3.7.2) + prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-gradual (0.4.0) + benchmark + diff-lcs (>= 1.2.0, < 2.0) + diffy (~> 3.0) + parallel (~> 1.10) + rainbow (>= 2.2.2, < 4.0) + rubocop (~> 1.0) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) + rubocop-md (2.0.4) + lint_roller (~> 1.1) + rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) + rubocop-on-rbs (2.0.0) + lint_roller (~> 1.1) + rbs (~> 4.0) + rubocop (>= 1.72.1, < 2.0) + zlib + rubocop-packaging (0.6.0) + lint_roller (~> 1.1.0) + rubocop (>= 1.72.1, < 2.0) + rubocop-performance (1.26.1) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.47.1, < 2.0) + rubocop-rake (0.7.1) + lint_roller (~> 1.1) + rubocop (>= 1.72.1) + rubocop-rspec (3.10.2) + lint_roller (~> 1.1) + regexp_parser (>= 2.0) + rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) + rubocop-ruby3_2 (3.0.7) + rubocop-gradual (~> 0.3, >= 0.3.6) + rubocop-md (~> 2.0, >= 2.0.4) + rubocop-rake (~> 0.7, >= 0.7.1) + rubocop-thread_safety (~> 0.7, >= 0.7.3) + standard-rubocop-lts (~> 2.0, >= 2.0.9) + version_gem (~> 1.1, >= 1.1.13) + rubocop-thread_safety (0.7.3) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-ast (>= 1.44.0, < 2.0) + ruby-progressbar (1.13.0) + service_actor (3.9.4) + zeitwerk (>= 1.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) + rexml + simplecov (~> 1.0) + simplecov-console (0.9.5) + ansi + simplecov + terminal-table + simplecov-rcov (0.3.7) + simplecov (>= 0.4.1) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) + standard (1.56.0) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.0) + rubocop (~> 1.88.0) + standard-custom (~> 1.0.0) + standard-performance (~> 1.8) + standard-custom (1.0.2) + lint_roller (~> 1.0) + rubocop (~> 1.50) + standard-performance (1.9.0) + lint_roller (~> 1.1) + rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) + standard-rubocop-lts (2.0.10) + standard (~> 1.54, >= 1.54.0) + standard-custom (~> 1.0, >= 1.0.2) + standard-performance (~> 1.9, >= 1.9.0) + version_gem (~> 1.1, >= 1.1.13) + stringio (3.2.0) + strscan (3.1.8) + terminal-table (4.0.0) + unicode-display_width (>= 1.1.1, < 4) + thor (1.5.0) + token-resolver (2.0.5) + parslet (~> 2.0) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) + tsort (0.2.0) + unicode-display_width (3.2.0) + unicode-emoji (~> 4.1) + unicode-emoji (4.2.0) + version_gem (1.1.14) + webrick (1.9.2) + yaml-converter (0.2.3) + hexapdf (>= 1.8, < 2) + kramdown (>= 2.4, < 3) + kramdown-parser-gfm (~> 1.1) + version_gem (~> 1.1, >= 1.1.13) + yard (0.9.45) + yard-fence (0.9.6) + rdoc (>= 6.11, < 8) + version_gem (~> 1.1, >= 1.1.13) + yard (~> 0.9, >= 0.9.37) + yard-junk (0.1.0) + benchmark + ostruct + rainbow + yard + yard-relative_markdown_links (0.6.0) + nokogiri (>= 1.14.3, < 2) + yard-timekeeper (0.2.4) + version_gem (~> 1.1, >= 1.1.13) + yard-yaml (0.2.3) + version_gem (~> 1.1, >= 1.1.13) + yaml-converter (~> 0.2) + zeitwerk (2.8.2) + zlib (3.2.3) + +PLATFORMS + x86_64-linux + +DEPENDENCIES + addressable (>= 2.8, < 3) + appraisal2-rubocop (~> 1.0, >= 1.0.0) + benchmark (~> 0.5, >= 0.5.0) + cgi (~> 0.5) + debug (>= 1.1) + erb (~> 6.0, >= 6.0.6) + gem_bench (~> 2.0, >= 2.0.5) + html-merge! + irb (~> 1.17) + kettle-soup-cover (~> 3.0, >= 3.0.3) + kramdown (~> 2.5, >= 2.5.2) + kramdown-parser-gfm (~> 1.1) + mutex_m (~> 0.2) + nomono (~> 1.0, >= 1.0.8) + rbs (>= 3.0) + rdoc (~> 6.11) + reek (~> 6.5, >= 6.5.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) + rubocop-packaging (~> 0.6, >= 0.6.0) + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) + standard (~> 1.56, >= 1.56.0) + stringio (>= 3.0) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) + yard-junk (~> 0.1, >= 0.1.0) + yard-relative_markdown_links (~> 0.6) + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) + +CHECKSUMS + addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af + ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 + appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d + ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 + ast-crispr (7.1.0) + ast-merge (7.1.0) + benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c + bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb + citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 + cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 + date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 + debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 + diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 + diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 + dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce + dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 + dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc + dry-initializer (3.2.0) sha256=37d59798f912dc0a1efe14a4db4a9306989007b302dcd5f25d0a2a20c166c4e3 + dry-logic (1.6.0) sha256=da6fedbc0f90fc41f9b0cc7e6f05f5d529d1efaef6c8dcc8e0733f685745cea2 + dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 + dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 + gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead + geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 + hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 + html-merge (7.1.0) + io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc + irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 + json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 + kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa + kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 + language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 + lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 + mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 + nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 + openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 + ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 + parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 + parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 + parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 + pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 + prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 + prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 + psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 + racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f + rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a + rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 + rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 + rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 + reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 + regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb + reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835 + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf + rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb + rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 + rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d + rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be + rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 + rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 + rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d + rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 + rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 + rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 + ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 + service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea + simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 + simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f + standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 + standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b + standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 + standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 + stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 + strscan (3.1.8) sha256=aae2db611a225559f21ffbb71765c9a4e60fd262534a9ea84f4f11c7f32f679e + terminal-table (4.0.0) sha256=f504793203f8251b2ea7c7068333053f0beeea26093ec9962e62ea79f94301d2 + thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c + tree_haver (7.1.0) + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 + tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f + unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 + unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f + version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 + yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 + yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 + yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 + yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd + yard-relative_markdown_links (0.6.0) sha256=3e5ffa85cbad9bac70bee5421774b190fb25d3bdf489323a5b3534f647d1a70e + yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a + yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 + zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 + zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 + +BUNDLED WITH + 4.0.17 diff --git a/gems/html-merge/LICENSE.md b/gems/html-merge/LICENSE.md new file mode 100644 index 000000000..57fe70a58 --- /dev/null +++ b/gems/html-merge/LICENSE.md @@ -0,0 +1,10 @@ +# License + +This project is made available under the following license. +Choose the option that best fits your use case: + +- [MIT](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/MIT.md) + +## Copyright Notice + +- Copyright (c) 2026 Peter H. Boling diff --git a/gems/html-merge/LICENSE.txt b/gems/html-merge/LICENSE.txt new file mode 100644 index 000000000..f9027eaec --- /dev/null +++ b/gems/html-merge/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2026 Peter H. Boling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/gems/html-merge/MIT.md b/gems/html-merge/MIT.md new file mode 100644 index 000000000..6d5d66d26 --- /dev/null +++ b/gems/html-merge/MIT.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +See [LICENSE.md](LICENSE.md) for the copyright notice. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/gems/html-merge/README.md b/gems/html-merge/README.md new file mode 100644 index 000000000..7c48e00d9 --- /dev/null +++ b/gems/html-merge/README.md @@ -0,0 +1,255 @@ +structuredmerge Logo by Aboling0, CC BY-SA 4.0 + +# 💎 Html::Merge + +[![Version][👽versioni]][👽version] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license] [![Downloads Rank][👽dl-ranki]][👽dl-rank] [![CI Current][🚎11-c-wfi]][🚎11-c-wf] + +`if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][✉️discord-invite], as I may have missed the [discord notification][✉️discord-invite]. + +--- + +`if ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job. + +[![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 at ko-fi.com][🖇kofi-img]][🖇kofi] + +
+ 👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️ + +I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo). + +
+ +## 🌻 Synopsis Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0 ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5 + +## 💡 Info you can shake a stick at + +| Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | +|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | +| Compliance | [![License: MIT][📄license-img]][📄license] [![Apache license compatibility: Category A][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | +| Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | +| Maintainer 🎖️ | [![Follow Me on LinkedIn][💖🖇linkedin-img]][💖🖇linkedin] [![Follow Me on Ruby.Social][💖🐘ruby-mast-img]][💖🐘ruby-mast] [![Follow Me on Bluesky][💖🦋bluesky-img]][💖🦋bluesky] [![Contact Maintainer][🚂maint-contact-img]][🚂maint-contact] [![My technical writing][💖💁🏼‍♂️devto-img]][💖💁🏼‍♂️devto] | +| `...` 💖 | [![Find Me on WellFound:][💖✌️wellfound-img]][💖✌️wellfound] [![Find Me on CrunchBase][💖💲crunchbase-img]][💖💲crunchbase] [![My LinkTree][💖🌳linktree-img]][💖🌳linktree] [![More About Me][💖💁🏼‍♂️aboutme-img]][💖💁🏼‍♂️aboutme] [🧊][💖🧊berg] [🐙][💖🐙hub] [🛖][💖🛖hut] [🧪][💖🧪lab] | + +### Compatibility + +Compatible with MRI Ruby 3.2.0+, and concordant releases of JRuby, and TruffleRuby. +CI workflows and Appraisals are generated for MRI Ruby 3.2.0+. +This test floor is configured by `ruby.test_minimum` in `.kettle-jem.yml` and +may be higher than the gem's runtime compatibility floor when legacy Rubies are +not practical for the current toolchain. + +kettle-dev Logo by Aboling0, CC BY-SA 4.0 + +The _amazing_ test matrix is powered by the kettle-dev stack. + +
+How kettle-dev manages complexity in tests + +| Gem | Source | Role | Daily download rank | +|-----|--------|------|---------------------| +| [appraisal2](https://bestgems.org/gems/appraisal2) | [GitHub](https://github.com/appraisal-rb/appraisal2) | multi-dependency Appraisal matrix generation | [![Daily download rank for appraisal2](https://img.shields.io/gem/rd/appraisal2.svg?style=flat-square)](https://bestgems.org/gems/appraisal2) | +| [appraisal2-rubocop](https://bestgems.org/gems/appraisal2-rubocop) | [GitHub](https://github.com/appraisal-rb/appraisal2-rubocop) | RuboCop Appraisal generator integration | [![Daily download rank for appraisal2-rubocop](https://img.shields.io/gem/rd/appraisal2-rubocop.svg?style=flat-square)](https://bestgems.org/gems/appraisal2-rubocop) | +| [kettle-dev](https://bestgems.org/gems/kettle-dev) | [GitHub](https://github.com/kettle-dev/kettle-dev) | development, release, and CI workflow tooling | [![Daily download rank for kettle-dev](https://img.shields.io/gem/rd/kettle-dev.svg?style=flat-square)](https://bestgems.org/gems/kettle-dev) | +| [kettle-jem](https://bestgems.org/gems/kettle-jem) | [GitHub](https://github.com/kettle-dev/kettle-jem) | Appraisals & CI workflow templates | [![Daily download rank for kettle-jem](https://img.shields.io/gem/rd/kettle-jem.svg?style=flat-square)](https://bestgems.org/gems/kettle-jem) | +| [kettle-soup-cover](https://bestgems.org/gems/kettle-soup-cover) | [GitHub](https://github.com/kettle-dev/kettle-soup-cover) | SimpleCov coverage policy and reporting | [![Daily download rank for kettle-soup-cover](https://img.shields.io/gem/rd/kettle-soup-cover.svg?style=flat-square)](https://bestgems.org/gems/kettle-soup-cover) | +| [kettle-test](https://bestgems.org/gems/kettle-test) | [GitHub](https://github.com/kettle-dev/kettle-test) | standard test runner and coverage harness | [![Daily download rank for kettle-test](https://img.shields.io/gem/rd/kettle-test.svg?style=flat-square)](https://bestgems.org/gems/kettle-test) | +| [rubocop-lts](https://bestgems.org/gems/rubocop-lts) | [GitHub](https://github.com/rubocop-lts/rubocop-lts) | Ruby-version-aware linting | [![Daily download rank for rubocop-lts](https://img.shields.io/gem/rd/rubocop-lts.svg?style=flat-square)](https://bestgems.org/gems/rubocop-lts) | +| [turbo_tests2](https://bestgems.org/gems/turbo_tests2) | [GitHub](https://github.com/galtzo-floss/turbo_tests2) | parallel test execution | [![Daily download rank for turbo_tests2](https://img.shields.io/gem/rd/turbo_tests2.svg?style=flat-square)](https://bestgems.org/gems/turbo_tests2) | + +
+ +## ✨ Installation + +Install the gem and add to the application's Gemfile by executing: + +```console +bundle add html-merge +``` + +If bundler is not being used to manage dependencies, install the gem by executing: + +```console +gem install html-merge +``` + +## ⚙️ Configuration + +## 🔧 Basic Usage + +TODO: Write usage instructions here + +## 🔐 Security + +See [SECURITY.md][🔐security]. + +## 🤝 Contributing + +If you need some ideas of where to help, you could work on adding more code coverage, +or if it is already 💯 (see [below](#code-coverage)) check [issues][🤝gh-issues] or [PRs][🤝gh-pulls], +or use the gem and think about how it could be better. + +We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it. + +See [CONTRIBUTING.md][🤝contributing] for more detailed instructions. + +## 📌 Versioning + +This library follows [![Semantic Versioning 2.0.0][📌semver-img]][📌semver] for its public API where practical. +For most applications, prefer the [Pessimistic Version Constraint][📌pvc] with two digits of precision. + +For example: + +```ruby +spec.add_dependency("html-merge", "~> 7.0") +``` + +
+📌 Is "Platform Support" part of the public API? More details inside. + +Dropping support for a platform can be a breaking change for affected users. +If a release changes supported platforms, it should be called out clearly in the changelog and versioned with that impact in mind. + +To get a better understanding of how SemVer is intended to work over a project's lifetime, +read this article from the creator of SemVer: + +- ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred] + +
+ +See [CHANGELOG.md][📌changelog] for a list of releases. + +## 📄 License + +The gem is available as open source under the terms of +the [MIT](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/MIT.md) [![License: MIT][📄license-img]][📄license-ref]. + +[gh-discussions]: https://github.com/structuredmerge/structuredmerge-ruby/discussions +[⛳liberapay-img]: https://img.shields.io/liberapay/goal/pboling.svg?logo=liberapay&color=a51611&style=flat +[⛳liberapay-bottom-img]: https://img.shields.io/liberapay/goal/pboling.svg?style=for-the-badge&logo=liberapay&color=a51611 +[⛳liberapay]: https://liberapay.com/pboling/donate +[🖇sponsor-img]: https://img.shields.io/badge/Sponsor_Me!-pboling.svg?style=social&logo=github +[🖇sponsor-bottom-img]: https://img.shields.io/badge/Sponsor_Me!-pboling-blue?style=for-the-badge&logo=github +[🖇sponsor]: https://github.com/sponsors/pboling +[🖇kofi-img]: https://img.shields.io/badge/ko--fi-%E2%9C%93-a51611.svg?style=flat +[🖇kofi]: https://ko-fi.com/pboling +[🖇buyme-small-img]: https://img.shields.io/badge/buy_me_a_coffee-%E2%9C%93-a51611.svg?style=flat +[🖇buyme-img]: https://img.buymeacoffee.com/button-api/?text=Buy%20me%20a%20latte&emoji=&slug=pboling&button_colour=FFDD00&font_colour=000000&font_family=Cookie&outline_colour=000000&coffee_colour=ffffff +[🖇buyme]: https://www.buymeacoffee.com/pboling +[🖇paypal-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=flat&logo=paypal +[🖇paypal-bottom-img]: https://img.shields.io/badge/donate-paypal-a51611.svg?style=for-the-badge&logo=paypal&color=0A0A0A +[🖇paypal]: https://www.paypal.com/paypalme/peterboling +[🖇floss-funding.dev]: https://floss-funding.dev +[🖇floss-funding-gem]: https://github.com/galtzo-floss/floss_funding +[✉️discord-invite]: https://discord.gg/3qme4XHNKN +[✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord +[✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white +[✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 +[✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 +[⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/html-merge +[⛳️namespace-img]: https://img.shields.io/badge/namespace-Html::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white +[⛳️gem-name]: https://bestgems.org/gems/html-merge +[⛳️name-img]: https://img.shields.io/badge/name-html--merge-3C2D2D.svg?style=square&logo=rubygems&logoColor=red +[⛳️tag-img]: https://img.shields.io/github/tag/structuredmerge/structuredmerge-ruby.svg +[⛳️tag]: https://github.com/structuredmerge/structuredmerge-ruby/releases +[🚂maint-blog]: http://www.railsbling.com/tags/html-merge +[🚂maint-blog-img]: https://img.shields.io/badge/blog-railsbling-0093D0.svg?style=for-the-badge&logo=rubyonrails&logoColor=orange +[🚂maint-contact]: http://www.railsbling.com/contact +[🚂maint-contact-img]: https://img.shields.io/badge/Contact-Maintainer-0093D0.svg?style=flat&logo=rubyonrails&logoColor=red +[💖🖇linkedin]: http://www.linkedin.com/in/peterboling +[💖🖇linkedin-img]: https://img.shields.io/badge/LinkedIn-Profile-0B66C2?style=flat&logo=newjapanprowrestling +[💖✌️wellfound]: https://wellfound.com/u/peter-boling +[💖✌️wellfound-img]: https://img.shields.io/badge/peter--boling-orange?style=flat&logo=wellfound +[💖💲crunchbase]: https://www.crunchbase.com/person/peter-boling +[💖💲crunchbase-img]: https://img.shields.io/badge/peter--boling-purple?style=flat&logo=crunchbase +[💖🐘ruby-mast]: https://ruby.social/@galtzo +[💖🐘ruby-mast-img]: https://img.shields.io/mastodon/follow/109447111526622197?domain=https://ruby.social&style=flat&logo=mastodon&label=Ruby%20@galtzo +[💖🦋bluesky]: https://bsky.app/profile/galtzo.com +[💖🦋bluesky-img]: https://img.shields.io/badge/@galtzo.com-0285FF?style=flat&logo=bluesky&logoColor=white +[💖🌳linktree]: https://linktr.ee/galtzo +[💖🌳linktree-img]: https://img.shields.io/badge/galtzo-purple?style=flat&logo=linktree +[💖💁🏼‍♂️devto]: https://dev.to/galtzo +[💖💁🏼‍♂️devto-img]: https://img.shields.io/badge/dev.to-0A0A0A?style=flat&logo=devdotto&logoColor=white +[💖💁🏼‍♂️aboutme]: https://about.me/peter.boling +[💖💁🏼‍♂️aboutme-img]: https://img.shields.io/badge/about.me-0A0A0A?style=flat&logo=aboutme&logoColor=white +[💖🧊berg]: https://codeberg.org/pboling +[💖🐙hub]: https://github.org/pboling +[💖🛖hut]: https://sr.ht/~galtzo/ +[💖🧪lab]: https://gitlab.com/pboling +[👨🏼‍🏫expsup-upwork]: https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share +[👨🏼‍🏫expsup-upwork-img]: https://img.shields.io/badge/UpWork-13544E?style=for-the-badge&logo=Upwork&logoColor=white +[👨🏼‍🏫expsup-codementor]: https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github +[👨🏼‍🏫expsup-codementor-img]: https://img.shields.io/badge/CodeMentor-Get_Help-1abc9c?style=for-the-badge&logo=CodeMentor&logoColor=white +[🏙️entsup-tidelift]: https://tidelift.com/subscription/pkg/rubygems-html-merge?utm_source=rubygems-html-merge&utm_medium=referral&utm_campaign=readme +[🏙️entsup-tidelift-img]: https://img.shields.io/badge/Tidelift_and_Sonar-Enterprise_Support-FD3456?style=for-the-badge&logo=sonar&logoColor=white +[🏙️entsup-tidelift-sonar]: https://blog.tidelift.com/tidelift-joins-sonar +[💁🏼‍♂️peterboling]: http://www.peterboling.com +[🚂railsbling]: http://www.railsbling.com +[📜src-gl-img]: https://img.shields.io/badge/GitLab-FBA326?style=for-the-badge&logo=Gitlab&logoColor=orange +[📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/html-merge +[📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue +[📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/html-merge +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green +[📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/html-merge +[📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white +[📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white +[📜gl-wiki]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/wikis/home +[📜gh-wiki]: https://github.com/structuredmerge/structuredmerge-ruby/wiki +[📜gl-wiki-img]: https://img.shields.io/badge/wiki-gitlab-943CD2.svg?style=for-the-badge&logo=gitlab&logoColor=white +[📜gh-wiki-img]: https://img.shields.io/badge/wiki-github-943CD2.svg?style=for-the-badge&logo=github&logoColor=white +[👽dl-rank]: https://bestgems.org/gems/html-merge +[👽dl-ranki]: https://img.shields.io/gem/rd/html-merge.svg +[👽version]: https://bestgems.org/gems/html-merge +[👽versioni]: https://img.shields.io/gem/v/html-merge.svg +[🚎11-c-wf]: https://github.com/structuredmerge/structuredmerge-ruby/actions/workflows/current.yml +[🚎11-c-wfi]: https://github.com/structuredmerge/structuredmerge-ruby/actions/workflows/current.yml/badge.svg +[💎ruby-c-i]: https://img.shields.io/badge/Ruby-current-CC342D?style=for-the-badge&logo=ruby&logoColor=green +[🤝gh-issues]: https://github.com/structuredmerge/structuredmerge-ruby/issues +[🤝gh-pulls]: https://github.com/structuredmerge/structuredmerge-ruby/pulls +[🤝gl-issues]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/issues +[🤝gl-pulls]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/merge_requests +[🤝cb-issues]: https://codeberg.org/structuredmerge/structuredmerge-ruby/issues +[🤝cb-pulls]: https://codeberg.org/structuredmerge/structuredmerge-ruby/pulls +[🤝cb-donate]: https://donate.codeberg.org/ +[🤝contributing]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CONTRIBUTING.md +[🖐contrib-rocks]: https://contrib.rocks +[🖐contributors]: https://github.com/structuredmerge/structuredmerge-ruby/graphs/contributors +[🖐contributors-img]: https://contrib.rocks/image?repo=structuredmerge/structuredmerge-ruby +[🪇conduct]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CODE_OF_CONDUCT.md +[🪇conduct-img]: https://img.shields.io/badge/Contributor_Covenant-2.1-259D6C.svg +[📌pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint +[📌semver]: https://semver.org/spec/v2.0.0.html +[📌semver-img]: https://img.shields.io/badge/semver-2.0.0-259D6C.svg?style=flat +[📌semver-breaking]: https://github.com/semver/semver/issues/716#issuecomment-869336139 +[📌major-versions-not-sacred]: https://tom.preston-werner.com/2022/05/23/major-version-numbers-are-not-sacred.html +[📌changelog]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/CHANGELOG.md +[📗keep-changelog]: https://keepachangelog.com/en/1.0.0/ +[📗keep-changelog-img]: https://img.shields.io/badge/keep--a--changelog-1.0.0-34495e.svg?style=flat +[📌gitmoji]: https://gitmoji.dev +[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square +[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ +[🧮kloc-img]: https://img.shields.io/badge/KLOC-5.053-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue +[🔐security]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/SECURITY.md +[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat +[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year +[📄license]: LICENSE.md +[📄license-ref]: https://github.com/structuredmerge/structuredmerge-ruby/blob/main/MIT.md +[📄license-img]: https://img.shields.io/badge/License-MIT-259D6C.svg +[📄license-compat]: https://www.apache.org/legal/resolved.html#category-a +[📄license-compat-img]: https://img.shields.io/badge/Apache_Compatible:_Category_A-%E2%9C%93-259D6C.svg?style=flat&logo=Apache +[📄ilo-declaration]: https://www.ilo.org/declaration/lang--en/index.htm +[📄ilo-declaration-img]: https://img.shields.io/badge/ILO_Fundamental_Principles-✓-259D6C.svg?style=flat +[🚎yard-current]: http://rubydoc.info/gems/html-merge +[🚎yard-head]: https://html-merge.galtzo.com +[💎stone_checksums]: https://github.com/galtzo-floss/stone_checksums +[💎SHA_checksums]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/checksums +[💎rlts]: https://github.com/rubocop-lts/rubocop-lts +[💎rlts-img]: https://img.shields.io/badge/code_style_&_linting-rubocop--lts-34495e.svg?plastic&logo=ruby&logoColor=white +[💎appraisal2]: https://github.com/appraisal-rb/appraisal2 +[💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white +[💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/ diff --git a/gems/html-merge/Rakefile b/gems/html-merge/Rakefile new file mode 100644 index 000000000..6bbda0fa6 --- /dev/null +++ b/gems/html-merge/Rakefile @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +### DUPLICATE DRIFT TASKS +begin + require "kettle/drift" + Kettle::Drift.install_tasks +rescue LoadError + desc("(stub) kettle:drift:check is unavailable") + task("kettle:drift:check") do + warn("NOTE: kettle-drift isn't installed, or is disabled for #{RUBY_VERSION} in the current environment") + end + desc("(stub) kettle:drift:update is unavailable") + task("kettle:drift:update") do + warn("NOTE: kettle-drift isn't installed, or is disabled for #{RUBY_VERSION} in the current environment") + end + desc("(stub) kettle:drift:force_update is unavailable") + task("kettle:drift:force_update") do + warn("NOTE: kettle-drift isn't installed, or is disabled for #{RUBY_VERSION} in the current environment") + end + desc("(stub) kettle:drift is unavailable") + task("kettle:drift" => "kettle:drift:update") +end diff --git a/gems/html-merge/bin/appraisal b/gems/html-merge/bin/appraisal new file mode 100755 index 000000000..bc7d25bd3 --- /dev/null +++ b/gems/html-merge/bin/appraisal @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'appraisal' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("appraisal2", "appraisal") diff --git a/gems/html-merge/bin/console b/gems/html-merge/bin/console new file mode 100755 index 000000000..87c370954 --- /dev/null +++ b/gems/html-merge/bin/console @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "bundler/setup" +require "html/merge" + +# You can add fixtures and/or initialization code here to make experimenting +# with your gem easier. You can also use a different console, if you like. + +require "irb" +IRB.start(__FILE__) diff --git a/gems/html-merge/bin/kettle-bump b/gems/html-merge/bin/kettle-bump new file mode 100755 index 000000000..708c1f9ec --- /dev/null +++ b/gems/html-merge/bin/kettle-bump @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-bump' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-bump") diff --git a/gems/html-merge/bin/kettle-changelog b/gems/html-merge/bin/kettle-changelog new file mode 100755 index 000000000..0e7fcc4d1 --- /dev/null +++ b/gems/html-merge/bin/kettle-changelog @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-changelog' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-changelog") diff --git a/gems/html-merge/bin/kettle-check-eof b/gems/html-merge/bin/kettle-check-eof new file mode 100755 index 000000000..13469d3ba --- /dev/null +++ b/gems/html-merge/bin/kettle-check-eof @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-check-eof' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-check-eof") diff --git a/gems/html-merge/bin/kettle-commit-msg b/gems/html-merge/bin/kettle-commit-msg new file mode 100755 index 000000000..b228ad670 --- /dev/null +++ b/gems/html-merge/bin/kettle-commit-msg @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-commit-msg' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-commit-msg") diff --git a/gems/html-merge/bin/kettle-dev-setup b/gems/html-merge/bin/kettle-dev-setup new file mode 100755 index 000000000..276319a7c --- /dev/null +++ b/gems/html-merge/bin/kettle-dev-setup @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-dev-setup' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-dev-setup") diff --git a/gems/html-merge/bin/kettle-dvcs b/gems/html-merge/bin/kettle-dvcs new file mode 100755 index 000000000..b572d48c5 --- /dev/null +++ b/gems/html-merge/bin/kettle-dvcs @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-dvcs' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-dvcs") diff --git a/gems/html-merge/bin/kettle-gh-release b/gems/html-merge/bin/kettle-gh-release new file mode 100755 index 000000000..93265cbd7 --- /dev/null +++ b/gems/html-merge/bin/kettle-gh-release @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-gh-release' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-gh-release") diff --git a/gems/html-merge/bin/kettle-gha-sha-pins b/gems/html-merge/bin/kettle-gha-sha-pins new file mode 100755 index 000000000..13b554c94 --- /dev/null +++ b/gems/html-merge/bin/kettle-gha-sha-pins @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-gha-sha-pins' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-gha-sha-pins") diff --git a/gems/html-merge/bin/kettle-pre-release b/gems/html-merge/bin/kettle-pre-release new file mode 100755 index 000000000..1b98ad614 --- /dev/null +++ b/gems/html-merge/bin/kettle-pre-release @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-pre-release' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-pre-release") diff --git a/gems/html-merge/bin/kettle-readme-backers b/gems/html-merge/bin/kettle-readme-backers new file mode 100755 index 000000000..fec80bd5f --- /dev/null +++ b/gems/html-merge/bin/kettle-readme-backers @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-readme-backers' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-readme-backers") diff --git a/gems/html-merge/bin/kettle-release b/gems/html-merge/bin/kettle-release new file mode 100755 index 000000000..1f5758a88 --- /dev/null +++ b/gems/html-merge/bin/kettle-release @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-release' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-dev", "kettle-release") diff --git a/gems/html-merge/bin/kettle-soup-cover b/gems/html-merge/bin/kettle-soup-cover new file mode 100755 index 000000000..32ddaca98 --- /dev/null +++ b/gems/html-merge/bin/kettle-soup-cover @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-soup-cover' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-soup-cover", "kettle-soup-cover") diff --git a/gems/html-merge/bin/kettle-test b/gems/html-merge/bin/kettle-test new file mode 100755 index 000000000..7a0c8a215 --- /dev/null +++ b/gems/html-merge/bin/kettle-test @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kettle-test' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kettle-test", "kettle-test") diff --git a/gems/html-merge/bin/rake b/gems/html-merge/bin/rake new file mode 100755 index 000000000..9efbee999 --- /dev/null +++ b/gems/html-merge/bin/rake @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'rake' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("rake", "rake") diff --git a/gems/html-merge/bin/rbs b/gems/html-merge/bin/rbs new file mode 100755 index 000000000..ffc95a0dc --- /dev/null +++ b/gems/html-merge/bin/rbs @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'rbs' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("rbs", "rbs") diff --git a/gems/html-merge/bin/rspec b/gems/html-merge/bin/rspec new file mode 100755 index 000000000..93e191c2f --- /dev/null +++ b/gems/html-merge/bin/rspec @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'rspec' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("rspec-core", "rspec") diff --git a/gems/html-merge/bin/setup b/gems/html-merge/bin/setup new file mode 100755 index 000000000..dce67d860 --- /dev/null +++ b/gems/html-merge/bin/setup @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail +IFS=$'\n\t' +set -vx + +bundle install + +# Do any other automated setup that you need to do here diff --git a/gems/html-merge/bin/yard b/gems/html-merge/bin/yard new file mode 100755 index 000000000..a7e8b6eed --- /dev/null +++ b/gems/html-merge/bin/yard @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# Generated by kettle-jem after curated `bundle binstubs`. +# +# Bundler's normal yard binstub executes the raw YARD CLI. That skips +# Rake task enhancements installed by documentation plugins such as +# yard-timekeeper. Those plugins run after YARD finishes and may restore +# checked-in docs files whose only diff is generated timestamp churn. +# +# The canonical docs entrypoint is therefore the Rake task, not raw +# `yard` / `bin/yard`. Keep this binstub as a handoff to the task so +# humans and tools that reach for `bin/yard` still run the full docs +# workflow with post-processing hooks. +exec("bundle", "exec", "rake", "yard") diff --git a/gems/html-merge/bin/yardoc b/gems/html-merge/bin/yardoc new file mode 100755 index 000000000..5ed01e71a --- /dev/null +++ b/gems/html-merge/bin/yardoc @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'yardoc' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("yard", "yardoc") diff --git a/gems/html-merge/bin/yri b/gems/html-merge/bin/yri new file mode 100755 index 000000000..80fa3d7ae --- /dev/null +++ b/gems/html-merge/bin/yri @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'yri' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("yard", "yri") diff --git a/gems/html-merge/certs/pboling.pem b/gems/html-merge/certs/pboling.pem new file mode 100644 index 000000000..d5c7e8bbb --- /dev/null +++ b/gems/html-merge/certs/pboling.pem @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE----- +MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl +ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW +A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM +DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy +LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA +uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61 +LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5 +mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN +coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV +FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj +yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1 +to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD +qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj +fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ +HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG +A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD +ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9 +wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR +L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm +GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k +kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq +QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA +0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p +DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt +L9nRqA== +-----END CERTIFICATE----- diff --git a/gems/html-merge/gemfiles/modular/benchmark/r4/v0.5.gemfile b/gems/html-merge/gemfiles/modular/benchmark/r4/v0.5.gemfile new file mode 100644 index 000000000..dec650815 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/benchmark/r4/v0.5.gemfile @@ -0,0 +1,2 @@ +# Ruby >= 2.1 +gem "benchmark", "~> 0.5", ">= 0.5.0" # Removed from Std Lib in Ruby 4.0 diff --git a/gems/html-merge/gemfiles/modular/benchmark/vHEAD.gemfile b/gems/html-merge/gemfiles/modular/benchmark/vHEAD.gemfile new file mode 100644 index 000000000..e1eb20c5e --- /dev/null +++ b/gems/html-merge/gemfiles/modular/benchmark/vHEAD.gemfile @@ -0,0 +1,2 @@ +# Ruby >= 2.1 +gem "benchmark", github: "ruby/benchmark", branch: "master" diff --git a/gems/html-merge/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/html-merge/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..19ed967c3 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem "cgi", "~> 0.5" diff --git a/gems/html-merge/gemfiles/modular/cgi/vHEAD.gemfile b/gems/html-merge/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..ef8b816ce --- /dev/null +++ b/gems/html-merge/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem "cgi", ">= 0.5" diff --git a/gems/html-merge/gemfiles/modular/coverage.gemfile b/gems/html-merge/gemfiles/modular/coverage.gemfile new file mode 100644 index 000000000..52d737872 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/coverage.gemfile @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +# We run code coverage on the latest version of Ruby only. + +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. +# When false (default / CI), remote released gems are used. +if ENV.fetch("KETTLE_DEV_DEV", "false").casecmp("false").zero? + # Coverage (remote/released) + platform :mri do + gem "kettle-soup-cover", "~> 3.0", ">= 3.0.3", require: false + end +else + eval_gemfile "coverage_local.gemfile" +end diff --git a/gems/html-merge/gemfiles/modular/coverage_local.gemfile b/gems/html-merge/gemfiles/modular/coverage_local.gemfile new file mode 100644 index 000000000..60c4cf2bb --- /dev/null +++ b/gems/html-merge/gemfiles/modular/coverage_local.gemfile @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +# Local path overrides for development. +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". + +require "nomono/bundler" + +local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[html-merge] - declared_gems + +# export KETTLE_DEV_DEV=/path/to/my +platform :mri do + eval_nomono_gems( + gems: local_gems_to_eval, + prefix: "KETTLE_DEV", + path_env: "KETTLE_DEV_DEV", + vendored_gems_env: "VENDORED_GEMS", + vendor_gem_dir_env: "VENDOR_GEM_DIR", + debug_env: "KETTLE_DEV_DEBUG" + ) + + if ENV.fetch("GALTZO_FLOSS_DEV", "false").casecmp("false") != 0 + eval_nomono_gems( + gems: %w[turbo_tests2], + prefix: "GALTZO_FLOSS", + path_env: "GALTZO_FLOSS_DEV", + vendored_gems_env: "GALTZO_FLOSS_VENDORED_GEMS", + vendor_gem_dir_env: "GALTZO_FLOSS_VENDOR_GEM_DIR", + debug_env: "GALTZO_FLOSS_DEBUG" + ) + end +end diff --git a/gems/html-merge/gemfiles/modular/debug.gemfile b/gems/html-merge/gemfiles/modular/debug.gemfile new file mode 100644 index 000000000..4e15b1a3a --- /dev/null +++ b/gems/html-merge/gemfiles/modular/debug.gemfile @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +# To retain during kettle-jem templating: +# kettle-jem:freeze +# # ... your code +# kettle-jem:unfreeze +# + +# Ex-Standard Library gems +# irb is included in main Gemfile (and unlocked_deps Appraisal), so it can't be included here. +# gem "irb", "~> 1.15", ">= 1.15.2" # removed from stdlib in 3.5 + +platform :mri do + # Debugging - Ensure ENV["DEBUG"] == "true" to use debuggers within spec suite + # Use binding.break, binding.b, or debugger in code + gem "debug", ">= 1.1" # ruby >= 2.7 + + # Dev Console - Binding.pry - Irb replacement + # gem "pry", "~> 0.14" # ruby >= 2.0 +end + +gem "gem_bench", "~> 2.0", ">= 2.0.5" diff --git a/gems/html-merge/gemfiles/modular/documentation.gemfile b/gems/html-merge/gemfiles/modular/documentation.gemfile new file mode 100644 index 000000000..d8215416e --- /dev/null +++ b/gems/html-merge/gemfiles/modular/documentation.gemfile @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +# To retain during kettle-jem templating: +# kettle-jem:freeze +# # ... your code +# kettle-jem:unfreeze +# + +# Documentation +gem "kramdown", "~> 2.5", ">= 2.5.2", require: false # Ruby >= 2.5 +gem "kramdown-parser-gfm", "~> 1.1", require: false # Ruby >= 2.3 +gem "yaml-converter", "~> 0.2", ">= 0.2.3", require: false # Ruby >= 3.2 +gem "yard", "~> 0.9", ">= 0.9.45", require: false +gem "yard-junk", "~> 0.1", ">= 0.1.0", require: false # Ruby >= 3.1 +gem "yard-relative_markdown_links", "~> 0.6", require: false + +if ENV.fetch("GALTZO_FLOSS_DEV", "false").casecmp("false").zero? + gem "yard-fence", "~> 0.9", ">= 0.9.6", require: false # Ruby >= 3.2 + gem "yard-timekeeper", "~> 0.2", ">= 0.2.4", require: false + gem "yard-yaml", "~> 0.2", ">= 0.2.3", require: false +else + eval_gemfile "documentation_local.gemfile" +end + +# Std Lib extractions +gem "rdoc", "~> 6.11", require: false unless ENV.fetch("KJ_FRAMEWORK_MATRIX_GEM", "") == "rdoc" diff --git a/gems/html-merge/gemfiles/modular/documentation_local.gemfile b/gems/html-merge/gemfiles/modular/documentation_local.gemfile new file mode 100644 index 000000000..a4664a155 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/documentation_local.gemfile @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +# Local path overrides for development. +# Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". + +require "nomono/bundler" + +local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[html-merge] - declared_gems + +# export GALTZO_FLOSS_DEV=/path/to/galtzo-floss +eval_nomono_gems( + gems: local_gems_to_eval, + prefix: "GALTZO_FLOSS", + path_env: "GALTZO_FLOSS_DEV", + vendored_gems_env: "GALTZO_FLOSS_VENDORED_GEMS", + vendor_gem_dir_env: "GALTZO_FLOSS_VENDOR_GEM_DIR", + debug_env: "GALTZO_FLOSS_DEBUG" +) diff --git a/gems/html-merge/gemfiles/modular/erb/r2/v3.0.gemfile b/gems/html-merge/gemfiles/modular/erb/r2/v3.0.gemfile new file mode 100644 index 000000000..c03bd8d85 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/erb/r2/v3.0.gemfile @@ -0,0 +1 @@ +gem "erb", "~> 3.0" # ruby >= 2.7.0 diff --git a/gems/html-merge/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/html-merge/gemfiles/modular/erb/r3/v5.0.gemfile new file mode 100644 index 000000000..1bd029cc1 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/erb/r3/v5.0.gemfile @@ -0,0 +1 @@ +gem "erb", "~> 6.0", ">= 6.0.6" # ruby >= 3.2.0 diff --git a/gems/html-merge/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/html-merge/gemfiles/modular/erb/r4/v5.0.gemfile new file mode 100644 index 000000000..1bd029cc1 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/erb/r4/v5.0.gemfile @@ -0,0 +1 @@ +gem "erb", "~> 6.0", ">= 6.0.6" # ruby >= 3.2.0 diff --git a/gems/html-merge/gemfiles/modular/erb/vHEAD.gemfile b/gems/html-merge/gemfiles/modular/erb/vHEAD.gemfile new file mode 100644 index 000000000..48fee4218 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/erb/vHEAD.gemfile @@ -0,0 +1,2 @@ +# Ruby >= 3.2 +gem "erb", github: "ruby/erb", branch: "master" diff --git a/gems/html-merge/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/html-merge/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..b0e69ab11 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == "truffleruby" && RUBY_ENGINE_VERSION.start_with?("22.3") + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem "json", "= 2.5.1" +end diff --git a/gems/html-merge/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/html-merge/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..7b2660a2b --- /dev/null +++ b/gems/html-merge/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == "truffleruby" && RUBY_ENGINE_VERSION.start_with?("23.0") + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem "json", "= 2.6.1" +end diff --git a/gems/html-merge/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/html-merge/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..dfa21f2e4 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == "truffleruby" && RUBY_ENGINE_VERSION.start_with?("23.1") + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem "json", "= 2.6.3" +end diff --git a/gems/html-merge/gemfiles/modular/mutex_m/r2/v0.3.gemfile b/gems/html-merge/gemfiles/modular/mutex_m/r2/v0.3.gemfile new file mode 100644 index 000000000..42e9d9bd4 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/mutex_m/r2/v0.3.gemfile @@ -0,0 +1,2 @@ +# Ruby >= 2.5 +gem "mutex_m", "~> 0.2" diff --git a/gems/html-merge/gemfiles/modular/mutex_m/r3/v0.3.gemfile b/gems/html-merge/gemfiles/modular/mutex_m/r3/v0.3.gemfile new file mode 100644 index 000000000..42e9d9bd4 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/mutex_m/r3/v0.3.gemfile @@ -0,0 +1,2 @@ +# Ruby >= 2.5 +gem "mutex_m", "~> 0.2" diff --git a/gems/html-merge/gemfiles/modular/mutex_m/r4/v0.3.gemfile b/gems/html-merge/gemfiles/modular/mutex_m/r4/v0.3.gemfile new file mode 100644 index 000000000..42e9d9bd4 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/mutex_m/r4/v0.3.gemfile @@ -0,0 +1,2 @@ +# Ruby >= 2.5 +gem "mutex_m", "~> 0.2" diff --git a/gems/html-merge/gemfiles/modular/mutex_m/vHEAD.gemfile b/gems/html-merge/gemfiles/modular/mutex_m/vHEAD.gemfile new file mode 100644 index 000000000..8af3b6fca --- /dev/null +++ b/gems/html-merge/gemfiles/modular/mutex_m/vHEAD.gemfile @@ -0,0 +1,2 @@ +# Ruby >= 2.5 (dependency of omniauth) +gem "mutex_m", github: "ruby/mutex_m", branch: "master" diff --git a/gems/html-merge/gemfiles/modular/optional.gemfile b/gems/html-merge/gemfiles/modular/optional.gemfile new file mode 100644 index 000000000..80bc45196 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/optional.gemfile @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +# To retain during kettle-jem templating: +# kettle-jem:freeze +# # ... your code +# kettle-jem:unfreeze +# + +# Optional dependencies are not depended on directly, but may be used if present. + +# Required for curated binstubs generated by kettle-jem install +gem "rbs", ">= 3.0", require: false # ruby >= 3.1 + +# Required for kettle-pre-release +# URL parsing with Unicode support (falls back to URI if not available) +gem "addressable", ">= 2.8", "< 3" # ruby >= 2.2 diff --git a/gems/html-merge/gemfiles/modular/rspec.gemfile b/gems/html-merge/gemfiles/modular/rspec.gemfile new file mode 100644 index 000000000..72fdf8b7f --- /dev/null +++ b/gems/html-merge/gemfiles/modular/rspec.gemfile @@ -0,0 +1,4 @@ +gem "rspec_junit_formatter", + github: "pboling/rspec_junit_formatter", + branch: "main", + ref: "9e6bcaaedd49477b62878ed568dc4ada5cc7cb5e" diff --git a/gems/html-merge/gemfiles/modular/runtime_heads.gemfile b/gems/html-merge/gemfiles/modular/runtime_heads.gemfile new file mode 100644 index 000000000..02f134c7f --- /dev/null +++ b/gems/html-merge/gemfiles/modular/runtime_heads.gemfile @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +# To retain during kettle-jem templating: +# kettle-jem:freeze +# # ... your code +# kettle-jem:unfreeze +# + +# Test against HEAD of runtime dependencies so we can proactively file bugs + +eval_gemfile("x_std_libs/vHEAD.gemfile") diff --git a/gems/html-merge/gemfiles/modular/stringio/r2/v3.0.gemfile b/gems/html-merge/gemfiles/modular/stringio/r2/v3.0.gemfile new file mode 100644 index 000000000..e85bb18ee --- /dev/null +++ b/gems/html-merge/gemfiles/modular/stringio/r2/v3.0.gemfile @@ -0,0 +1,5 @@ +# !!WARNING!! +# NOT SEMVER +# Version 3.0.7 dropped support for Ruby <= 2.7 +# Version 3.0.0 dropped support for Ruby <= 2.4 +gem "stringio", ">= 3.0" diff --git a/gems/html-merge/gemfiles/modular/stringio/r3/v3.0.gemfile b/gems/html-merge/gemfiles/modular/stringio/r3/v3.0.gemfile new file mode 100644 index 000000000..e85bb18ee --- /dev/null +++ b/gems/html-merge/gemfiles/modular/stringio/r3/v3.0.gemfile @@ -0,0 +1,5 @@ +# !!WARNING!! +# NOT SEMVER +# Version 3.0.7 dropped support for Ruby <= 2.7 +# Version 3.0.0 dropped support for Ruby <= 2.4 +gem "stringio", ">= 3.0" diff --git a/gems/html-merge/gemfiles/modular/stringio/r4/v3.0.gemfile b/gems/html-merge/gemfiles/modular/stringio/r4/v3.0.gemfile new file mode 100644 index 000000000..e85bb18ee --- /dev/null +++ b/gems/html-merge/gemfiles/modular/stringio/r4/v3.0.gemfile @@ -0,0 +1,5 @@ +# !!WARNING!! +# NOT SEMVER +# Version 3.0.7 dropped support for Ruby <= 2.7 +# Version 3.0.0 dropped support for Ruby <= 2.4 +gem "stringio", ">= 3.0" diff --git a/gems/html-merge/gemfiles/modular/stringio/vHEAD.gemfile b/gems/html-merge/gemfiles/modular/stringio/vHEAD.gemfile new file mode 100644 index 000000000..5f2a74126 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/stringio/vHEAD.gemfile @@ -0,0 +1,2 @@ +# Ruby >= 2.5 (dependency of omniauth) +gem "stringio", github: "ruby/stringio", branch: "master" diff --git a/gems/html-merge/gemfiles/modular/style.gemfile b/gems/html-merge/gemfiles/modular/style.gemfile new file mode 100644 index 000000000..35de4dcd6 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/style.gemfile @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +# To retain during kettle-jem templating: +# kettle-jem:freeze +# # ... your code +# kettle-jem:unfreeze +# + +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. + +gem "reek", "~> 6.5", ">= 6.5.0" + +platform :mri do + gem "appraisal2-rubocop", "~> 1.0", ">= 1.0.0", require: false + gem "rubocop-gradual", "~> 0.4", ">= 0.4.0" + gem "rubocop-minitest", "~> 0.40", ">= 0.40.0" + gem "rubocop-on-rbs", "~> 2.0", ">= 2.0.0" # ruby >= 3.2.0 + # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard + gem "rubocop-packaging", "~> 0.6", ">= 0.6.0" + gem "standard", "~> 1.56", ">= 1.56.0" + + if ENV.fetch("RUBOCOP_LTS_LOCAL", "false").casecmp("false").zero? + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem "rubocop-lts", "~> 24.2", ">= 24.2.1" unless declared_gems.include?("rubocop-lts") + gem "rubocop-lts-rspec", "~> 1.0", ">= 1.0.5" unless declared_gems.include?("rubocop-lts-rspec") + gem "rubocop-ruby3_2", "~> 3.0", ">= 3.0.6" unless declared_gems.include?("rubocop-ruby3_2") + else + eval_gemfile("style_local.gemfile") + end +end diff --git a/gems/html-merge/gemfiles/modular/style_local.gemfile b/gems/html-merge/gemfiles/modular/style_local.gemfile new file mode 100644 index 000000000..48a918f73 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/style_local.gemfile @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. + +# Local path overrides for development. +# Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". + +require "nomono/bundler" + +local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[html-merge] - declared_gems + +# export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts +platform :mri do + eval_nomono_gems( + gems: local_gems_to_eval, + prefix: "RUBOCOP_LTS", + path_env: "RUBOCOP_LTS_LOCAL", + vendored_gems_env: "VENDORED_GEMS", + vendor_gem_dir_env: "VENDOR_GEM_DIR", + debug_env: "RUBOCOP_LTS_DEBUG", + root: ["src", "rubocop-lts"] + ) +end diff --git a/gems/html-merge/gemfiles/modular/templating.gemfile b/gems/html-merge/gemfiles/modular/templating.gemfile new file mode 100644 index 000000000..47138ffbb --- /dev/null +++ b/gems/html-merge/gemfiles/modular/templating.gemfile @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +structuredmerge_remote = ENV.fetch("STRUCTUREDMERGE_DEV", "false").casecmp("false").zero? +kettle_remote = ENV.fetch("KETTLE_DEV_DEV", "false").casecmp("false").zero? + +if structuredmerge_remote + # Parser dependencies for released installs. + gem "tree_sitter_language_pack", "~> 1.13", ">= 1.13.3" + # Merge recipes for released installs. + gem "kettle-jem", ">= 7.0" +end + +if kettle_remote + # Template/plugin checks for released installs. + gem "kettle-drift", "~> 1.0", ">= 1.0.6", require: false +end + +# Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. +# When false (default / CI), released kettle-jem brings merge gems and parser dependencies. +# Local path overrides bring the same dependencies from sibling gemspecs. +# +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. +# When false (default / CI), released Kettle plugin gems are used. +eval_gemfile "templating_local.gemfile" unless structuredmerge_remote && kettle_remote diff --git a/gems/html-merge/gemfiles/modular/templating_local.gemfile b/gems/html-merge/gemfiles/modular/templating_local.gemfile new file mode 100644 index 000000000..6cd0b6e3c --- /dev/null +++ b/gems/html-merge/gemfiles/modular/templating_local.gemfile @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +# Local path overrides for templating development. +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV +# is not "false". + +require "nomono/bundler" + +structuredmerge_local_gems = %w[ + tree_haver + ast-merge + ast-merge-git + ast-template + bash-merge + binary-merge + commonmarker-merge + citrus-toml-merge + dotenv-merge + go-merge + json-merge + kettle-jem + kramdown-merge + markdown-merge + markly-merge + parslet-toml-merge + plain-merge + prism-merge + psych-merge + rbs-merge + ruby-merge + rust-merge + smorg-rb + typescript-merge + toml-merge + yaml-merge + zip-merge + ast-crispr + ast-crispr-markdown-markly + ast-crispr-ruby-prism +] + +kettle_dev_local_gems = %w[ + kettle-dev kettle-test kettle-soup-cover kettle-drift +] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[html-merge] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[html-merge] - declared_gems + +platform :mri do + if ENV.fetch("STRUCTUREDMERGE_DEV", "false").casecmp("false") != 0 + eval_nomono_gems( + gems: structuredmerge_local_gems_to_eval, + prefix: "STRUCTUREDMERGE", + path_env: "STRUCTUREDMERGE_DEV", + vendored_gems_env: "VENDORED_GEMS", + vendor_gem_dir_env: "VENDOR_GEM_DIR", + debug_env: "STRUCTUREDMERGE_DEBUG" + ) + end + + if ENV.fetch("KETTLE_DEV_DEV", "false").casecmp("false") != 0 + eval_nomono_gems( + gems: kettle_dev_local_gems_to_eval, + prefix: "KETTLE_DEV", + path_env: "KETTLE_DEV_DEV", + vendored_gems_env: "VENDORED_GEMS", + vendor_gem_dir_env: "VENDOR_GEM_DIR", + debug_env: "KETTLE_DEV_DEBUG" + ) + end +end diff --git a/gems/html-merge/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/html-merge/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..eaab4a473 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem "webrick", "~> 1.9" diff --git a/gems/html-merge/gemfiles/modular/webrick/vHEAD.gemfile b/gems/html-merge/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..8a789b634 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem "webrick", ">= 1.9" diff --git a/gems/html-merge/gemfiles/modular/x_std_libs.gemfile b/gems/html-merge/gemfiles/modular/x_std_libs.gemfile new file mode 100644 index 000000000..77aad43f2 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/x_std_libs.gemfile @@ -0,0 +1,12 @@ +### Std Lib Extracted Gems +ruby_version = Gem::Version.new(RUBY_VERSION) + +if ruby_version >= Gem::Version.new("4.0") + eval_gemfile "x_std_libs/r4/libs.gemfile" +elsif ruby_version >= Gem::Version.new("3.2") + eval_gemfile "x_std_libs/r3/libs.gemfile" +elsif ruby_version >= Gem::Version.new("3.1") + eval_gemfile "x_std_libs/r3.1/libs.gemfile" +else + eval_gemfile "x_std_libs/r2/libs.gemfile" +end diff --git a/gems/html-merge/gemfiles/modular/x_std_libs/r2/libs.gemfile b/gems/html-merge/gemfiles/modular/x_std_libs/r2/libs.gemfile new file mode 100644 index 000000000..441c4f03a --- /dev/null +++ b/gems/html-merge/gemfiles/modular/x_std_libs/r2/libs.gemfile @@ -0,0 +1,3 @@ +eval_gemfile "../../erb/r2/v3.0.gemfile" +eval_gemfile "../../mutex_m/r2/v0.3.gemfile" +eval_gemfile "../../stringio/r2/v3.0.gemfile" diff --git a/gems/html-merge/gemfiles/modular/x_std_libs/r3/libs.gemfile b/gems/html-merge/gemfiles/modular/x_std_libs/r3/libs.gemfile new file mode 100644 index 000000000..c293a3ddd --- /dev/null +++ b/gems/html-merge/gemfiles/modular/x_std_libs/r3/libs.gemfile @@ -0,0 +1,3 @@ +eval_gemfile "../../erb/r3/v5.0.gemfile" +eval_gemfile "../../mutex_m/r3/v0.3.gemfile" +eval_gemfile "../../stringio/r3/v3.0.gemfile" diff --git a/gems/html-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/html-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile new file mode 100644 index 000000000..eb5574247 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -0,0 +1,6 @@ +eval_gemfile "../../erb/r4/v5.0.gemfile" +eval_gemfile "../../mutex_m/r4/v0.3.gemfile" +eval_gemfile "../../stringio/r4/v3.0.gemfile" +eval_gemfile "../../benchmark/r4/v0.5.gemfile" +eval_gemfile "../../cgi/r4/v0.5.gemfile" +eval_gemfile "../../webrick/r4/v1.9.gemfile" diff --git a/gems/html-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/html-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile new file mode 100644 index 000000000..d4d5b16c9 --- /dev/null +++ b/gems/html-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -0,0 +1,6 @@ +eval_gemfile "../erb/vHEAD.gemfile" +eval_gemfile "../mutex_m/vHEAD.gemfile" +eval_gemfile "../stringio/vHEAD.gemfile" +eval_gemfile "../benchmark/vHEAD.gemfile" +eval_gemfile "../cgi/vHEAD.gemfile" +eval_gemfile "../webrick/vHEAD.gemfile" diff --git a/gems/html-merge/html-merge.gemspec b/gems/html-merge/html-merge.gemspec new file mode 100644 index 000000000..dc6135a65 --- /dev/null +++ b/gems/html-merge/html-merge.gemspec @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require_relative "lib/html/merge/version" + +Gem::Specification.new do |spec| + spec.name = "html-merge" + spec.version = Html::Merge::VERSION + spec.authors = ["Peter H. Boling"] + spec.email = ["peter.boling@gmail.com"] + + spec.summary = "💎 Structured Merge HTML analysis for Ruby" + spec.description = "💎 Parser-backed HTML analysis and merge primitives for Structured Merge." + spec.homepage = "https://github.com/structuredmerge/structuredmerge-ruby" + spec.license = "MIT" + spec.required_ruby_version = ">= 3.2.0" + spec.metadata["homepage_uri"] = spec.homepage + spec.metadata["source_code_uri"] = "#{spec.homepage}/tree/v#{spec.version}/gems/html-merge" + spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/v#{spec.version}/CHANGELOG.md" + spec.metadata["rubygems_mfa_required"] = "true" + + # Uncomment the line below to require MFA for gem pushes. + # This helps protect your gem from supply chain attacks by ensuring + # no one can publish a new version without multi-factor authentication. + # See: https://guides.rubygems.org/mfa-requirement-opt-in/ + # spec.metadata["rubygems_mfa_required"] = "true" + + # Specify which files should be added to the gem when it is released. + # The `git ls-files -z` loads the files in the RubyGem that have been added into git. + gemspec = File.basename(__FILE__) + spec.files = IO.popen(%w[git ls-files -z], chdir: __dir__, err: IO::NULL) do |ls| + ls.readlines("\x0", chomp: true).reject do |f| + (f == gemspec) || + f.start_with?(*%w[bin/ Gemfile .gitignore .rspec spec/ .github/ .rubocop.yml]) + end + end + spec.bindir = "exe" + spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) } + spec.require_paths = ["lib"] + + # Uncomment to register a new dependency of your gem + spec.add_dependency "ast-merge", "= #{spec.version}" + spec.add_dependency "ast-crispr", "= #{spec.version}" + spec.add_dependency "tree_haver", "= #{spec.version}" + spec.add_dependency "version_gem", "~> 1.1", ">= 1.1.9" + + # For more information and examples about making a new gem, check out our + # guide at: https://guides.rubygems.org/make-your-own-gem/ +end diff --git a/gems/html-merge/lib/html/merge.rb b/gems/html-merge/lib/html/merge.rb new file mode 100644 index 000000000..1c40dcc2b --- /dev/null +++ b/gems/html-merge/lib/html/merge.rb @@ -0,0 +1,259 @@ +# frozen_string_literal: true + +require "version_gem" +require_relative "merge/version" + +Html::Merge::Version.class_eval do + extend VersionGem::Basic +end + +require "tree_haver" +require "ast/merge" + +module Html + module Merge + PACKAGE_NAME = "html-merge" + BACKEND_REFERENCE = TreeHaver::KREUZBERG_LANGUAGE_PACK_BACKEND + BACKEND_REGISTRY = Struct.new(:registered, :mutex).new(false, Mutex.new) + + class Error < Ast::Merge::Error; end + class ParseError < Ast::Merge::ParseError; end + + autoload :CrisprAdapter, "html/merge/crispr_adapter" + + module_function + + def register_backend! + BACKEND_REGISTRY.mutex.synchronize do + return if BACKEND_REGISTRY.registered + + TreeHaver::BackendRegistry.register(BACKEND_REFERENCE) + + grammar_finder = TreeHaver::GrammarFinder.new(:html) + grammar_finder.register! if grammar_finder.available? + + BACKEND_REGISTRY.registered = true + end + end + + def html_feature_profile + { + family: "html", + supported_dialects: ["html"], + supported_policies: [] + } + end + + def available_html_backends + html_backend_available_for_analysis?(BACKEND_REFERENCE.id) ? [BACKEND_REFERENCE] : [] + end + + def html_backend_feature_profile(backend: nil) + requested = requested_html_backend_id(backend) + unless available_html_backends.any? { |backend_ref| backend_ref.id == requested } + return unsupported_feature_result("Unsupported HTML backend #{requested}.") + end + + html_feature_profile.merge( + backend: requested, + backend_ref: BACKEND_REFERENCE.to_h + ) + end + + def html_plan_context(backend: nil) + profile = html_backend_feature_profile(backend: backend) + return profile if profile[:ok] == false + + { + family_profile: html_feature_profile, + feature_profile: { + backend: profile[:backend], + supports_dialects: false, + supported_policies: profile[:supported_policies] + } + } + end + + def parse_html(source, dialect = "html", backend: nil) + return unsupported_feature_result("Unsupported HTML dialect #{dialect}.") unless dialect.to_s == "html" + + requested = requested_html_backend_id(backend) + unless available_html_backends.any? { |backend_ref| backend_ref.id == requested } + return unsupported_feature_result("Unsupported HTML backend #{requested}.") + end + + register_backend! + tree = TreeHaver.with_backend(requested) { TreeHaver.parser_for(:html).parse(source.to_s) } + root = tree.root_node + diagnostics = html_parse_error_nodes(root).map do |node| + { + severity: "error", + category: "parse_error", + message: "HTML parse error in #{node.type}", + span: html_node_span(node) + } + end + return {ok: false, diagnostics: diagnostics, policies: []} unless diagnostics.empty? + + { + ok: true, + diagnostics: [], + analysis: { + dialect: "html", + root_kind: root.type, + nodes: html_node_summaries(root) + }, + policies: [] + } + rescue TreeHaver::Error, StandardError => e + { + ok: false, + diagnostics: [{ + severity: "error", + category: "parse_error", + message: e.message + }], + policies: [] + } + end + + def html_root_node(source, backend: nil) + requested = requested_html_backend_id(backend) + register_backend! + TreeHaver.with_backend(requested) { TreeHaver.parser_for(:html).parse(source.to_s).root_node } + end + + def html_node_summaries(root) + nodes = [] + visit_html_node(root) do |node| + next unless node.structural? + + nodes << { + type: node.type, + span: html_node_span(node), + text: node.text.to_s.strip[0, 120] + } + end + nodes + end + + def html_parse_error_nodes(root) + errors = [] + visit_html_node(root) do |node| + errors << node if node.has_error? || node.type == "ERROR" + end + errors + end + + def visit_html_node(node, &block) + yield node + node.child_count.times do |index| + child = node.child(index) + visit_html_node(child, &block) if child + end + end + + def html_node_span(node) + start_point = html_point(html_raw_point(node, :start)) + end_point = html_point(html_raw_point(node, :end)) + { + start_byte: node.start_byte, + end_byte: node.end_byte, + start_line: start_point.fetch(:row) + 1, + end_line: end_point.fetch(:row) + 1, + start_column: start_point.fetch(:column), + end_column: end_point.fetch(:column) + } + end + + def html_raw_point(node, boundary) + raw_node = node.respond_to?(:inner_node) ? node.inner_node : node + methods = boundary == :start ? %i[start_point start_position] : %i[end_point end_position] + methods.each do |method_name| + return raw_node.public_send(method_name) if raw_node.respond_to?(method_name) + end + + node.public_send(methods.first) + end + + def html_point(point) + if point.respond_to?(:row) && point.respond_to?(:column) + return {row: point.row, column: point.column} + end + + return {row: point[:row], column: point[:column]} if point.respond_to?(:[]) + + raise Error, "Unsupported TreeHaver point #{point.inspect}" + end + + def html_backend_available_for_analysis?(backend_id) + requested = requested_html_backend_id(backend_id) + register_backend! + TreeHaver.with_backend(requested) { TreeHaver.parser_for(:html).respond_to?(:parse) } + rescue TreeHaver::Error, StandardError + false + end + + def requested_html_backend_id(backend) + backend.to_s.empty? ? BACKEND_REFERENCE.id : backend.to_s + end + + def unsupported_feature_result(message) + { + ok: false, + diagnostics: [{ + severity: "error", + category: "unsupported_feature", + message: message + }], + policies: [] + } + end + + def document_context(content:, source_label: "source") + require "ast/crispr" + + Ast::Crispr::DocumentContext.new( + content: content, + source_label: source_label, + adapter: CrisprAdapter.new + ) + end + + def element_text_selector(text:, id: nil) + require "ast/crispr" + + Ast::Crispr::Selectors.owner_filter( + id: id || "html_element_text:#{text}", + adapter: CrisprAdapter.new, + owner_scope: :html_element + ) do |_context, owner| + owner.type == "element" && + owner.text.include?(text.to_s) && + !html_descendant_element_text?(owner.node, text.to_s) + end + end + + def html_descendant_element_text?(node, text) + node.child_count.times.any? do |index| + child = node.child(index) + next false unless child + + (child.type == "element" && child.text.include?(text)) || html_descendant_element_text?(child, text) + end + end + + def ensure_yard_content_wrapper(source) + require "ast/crispr" + + replacement = %(

Documentation by YARD

\n) + target = element_text_selector(text: "Documentation by YARD", id: "yard_title_element") + actor = Ast::Crispr::Replace.result(content: source.to_s, target: target, replacement: replacement) + if actor.failure? + raise Error, actor.respond_to?(:error) ? actor.error.to_s : "HTML CRISPR replacement failed" + end + + actor.updated_content + end + end +end diff --git a/gems/html-merge/lib/html/merge/crispr_adapter.rb b/gems/html-merge/lib/html/merge/crispr_adapter.rb new file mode 100644 index 000000000..81b580c25 --- /dev/null +++ b/gems/html-merge/lib/html/merge/crispr_adapter.rb @@ -0,0 +1,63 @@ +# frozen_string_literal: true + +require "ast/crispr" + +module Html + module Merge + class CrisprAdapter + Location = Struct.new(:start_line, :end_line, keyword_init: true) + Owner = Struct.new(:node, :type, :text, :location, keyword_init: true) + + def read_ast(document) + result = Html::Merge.parse_html(document.content) + unless result.fetch(:ok) + raise Ast::Crispr::Error.new( + "Unable to parse HTML for CRISPR", + details: {source_label: document.source_label, diagnostics: result.fetch(:diagnostics)} + ) + end + + result + end + + def structural_owners(document, owner_scope: :html_element) + raise Ast::Crispr::Error.new("Unsupported HTML CRISPR owner scope", details: {owner_scope: owner_scope}) unless owner_scope.to_sym == :html_element + + root = Html::Merge.html_root_node(document.content) + owners = [] + Html::Merge.visit_html_node(root) do |node| + next unless node.structural? + next unless node.type == "element" + + span = Html::Merge.html_node_span(node) + owners << Owner.new( + node: node, + type: node.type, + text: node.text.to_s, + location: Location.new(start_line: span.fetch(:start_line), end_line: span.fetch(:end_line)) + ) + end + owners + end + + def comment_regions_for(_document, _owner, region: :leading, owner_scope: :html_element) + raise Ast::Crispr::Error.new( + "HTML CRISPR comment regions are not implemented", + details: {region: region, owner_scope: owner_scope} + ) + end + + def comment_region_text(_document, _comment_region) + raise Ast::Crispr::Error.new("HTML CRISPR comment regions are not implemented") + end + + def structure_profile(owner_scope: :html_element) + Ast::Crispr::StructureProfile.new( + owner_scope: owner_scope, + owner_selector: :html_element, + metadata: {source: :html_merge} + ) + end + end + end +end diff --git a/gems/html-merge/lib/html/merge/version.rb b/gems/html-merge/lib/html/merge/version.rb new file mode 100644 index 000000000..e9c908991 --- /dev/null +++ b/gems/html-merge/lib/html/merge/version.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +module Html + module Merge + module Version + VERSION = "7.1.0" + end + VERSION = Version::VERSION # Traditional Constant Location + end +end diff --git a/gems/html-merge/sig/html/merge.rbs b/gems/html-merge/sig/html/merge.rbs new file mode 100644 index 000000000..1d007d6d8 --- /dev/null +++ b/gems/html-merge/sig/html/merge.rbs @@ -0,0 +1,18 @@ +module Html + module Merge + VERSION: String + module Version + VERSION: String + end + + def self.register_backend!: () -> nil + def self.html_feature_profile: () -> Hash[Symbol, untyped] + def self.available_html_backends: () -> Array[untyped] + def self.html_backend_feature_profile: (?backend: untyped) -> Hash[Symbol, untyped] + def self.html_plan_context: (?backend: untyped) -> Hash[Symbol, untyped] + def self.parse_html: (String source, ?String dialect, ?backend: untyped) -> Hash[Symbol, untyped] + def self.document_context: (content: String, ?source_label: String) -> untyped + def self.element_text_selector: (text: String, ?id: String?) -> untyped + def self.ensure_yard_content_wrapper: (String source) -> String + end +end diff --git a/gems/html-merge/spec/html/merge_spec.rb b/gems/html-merge/spec/html/merge_spec.rb new file mode 100644 index 000000000..62d4ab36d --- /dev/null +++ b/gems/html-merge/spec/html/merge_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +RSpec.describe Html::Merge do + it "has a version number" do + expect(Html::Merge::VERSION).not_to be nil + end + + it "parses HTML through TreeHaver" do + result = described_class.parse_html(<<~HTML) + + +

Documentation by YARD

+ + HTML + + expect(result).to include(ok: true) + expect(result.dig(:analysis, :root_kind)).to be_a(String) + expect(result.dig(:analysis, :nodes).map { |node| node.fetch(:type) }).to include("element") + end + + it "reports the HTML feature profile" do + expect(described_class.html_plan_context).to include( + family_profile: include(family: "html"), + feature_profile: include(supports_dialects: false) + ) + end + + it "uses ast-crispr with HTML structural owners to repair a YARD content wrapper" do + source = <<~HTML + + +

Documentation by YARD

+ + + HTML + + updated = described_class.ensure_yard_content_wrapper(source) + + expect(updated).to include('

Documentation by YARD

') + expect(described_class.parse_html(updated)).to include(ok: true) + end +end diff --git a/gems/html-merge/spec/spec_helper.rb b/gems/html-merge/spec/spec_helper.rb new file mode 100644 index 000000000..92447f09b --- /dev/null +++ b/gems/html-merge/spec/spec_helper.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +# Config for development dependencies of this library +# i.e., not configured by this library +# +# SimpleCov & related config (must run BEFORE any other requires) +# NOTE: Gemfiles for non-coverage appraisals may not have kettle-soup-cover. +# The rescue LoadError handles that scenario. +begin + require "kettle-soup-cover" + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require "simplecov" + require "kettle/soup/cover/config" + SimpleCov.start + end +rescue LoadError => error + # check the error message and re-raise when unexpected + raise error unless error.message.include?("kettle") +end + +# External RSpec & related config +require "kettle/test/rspec" + +require "html/merge" + +RSpec.configure do |config| + # Enable flags like --only-failures and --next-failure + config.example_status_persistence_file_path = ".rspec_status" + + # Disable RSpec exposing methods globally on `Module` and `main` + config.disable_monkey_patching! + + config.expect_with :rspec do |c| + c.syntax = :expect + end +end diff --git a/gems/json-merge/.kettle-drift.lock b/gems/json-merge/.kettle-drift.lock deleted file mode 100644 index e3a4ed60c..000000000 --- a/gems/json-merge/.kettle-drift.lock +++ /dev/null @@ -1,337 +0,0 @@ -{ - "(direct_sibling_local ||\nENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)": [ - { - "file": "Gemfile", - "lines": [ - 80, - 120, - 160, - 200, - 240, - 280, - 320, - 360, - 400 - ] - } - ], - ".find { |spec| spec.name == 'nomono' }\nnomono_locked = nomono_locked_spec &&": [ - { - "file": "Gemfile", - "lines": [ - 91, - 131, - 171, - 211, - 251, - 291, - 331, - 371, - 411 - ] - } - ], - "ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?)\ndirect_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')": [ - { - "file": "Gemfile", - "lines": [ - 81, - 121, - 161, - 201, - 241, - 281, - 321, - 361, - 401 - ] - } - ], - "Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)\nnomono_activation_requirements = [\"= #{nomono_locked_spec.version}\"] if nomono_locked": [ - { - "file": "Gemfile", - "lines": [ - 93, - 133, - 173, - 213, - 253, - 293, - 333, - 373, - 413 - ] - } - ], - "Kernel.send(:gem, 'nomono', *nomono_activation_requirements)\nrequire 'nomono/bundler'": [ - { - "file": "Gemfile", - "lines": [ - 96, - 136, - 176, - 216, - 256, - 296, - 336, - 376, - 416 - ] - } - ], - "direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV')\ndirect_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil)": [ - { - "file": "Gemfile", - "lines": [ - 82, - 122, - 162, - 202, - 242, - 282, - 322, - 362, - 402 - ] - } - ], - "eval_nomono_gems(\ngems: direct_sibling_gems,": [ - { - "file": "Gemfile", - "lines": [ - 60, - 100, - 140, - 180, - 220, - 260, - 300, - 340, - 380, - 420 - ] - } - ], - "gems: direct_sibling_gems,\nprefix: 'STRUCTUREDMERGE',": [ - { - "file": "Gemfile", - "lines": [ - 101, - 141, - 181, - 221, - 261, - 301, - 341, - 381, - 421 - ] - } - ], - "if File.file?(nomono_lockfile)\nnomono_locked_spec = Bundler::LockfileParser": [ - { - "file": "Gemfile", - "lines": [ - 43, - 87, - 127, - 167, - 207, - 247, - 287, - 327, - 367, - 407 - ] - } - ], - "if direct_sibling_dev_was_set\nENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original": [ - { - "file": "Gemfile", - "lines": [ - 110, - 150, - 190, - 230, - 270, - 310, - 350, - 390, - 430 - ] - } - ], - "if direct_sibling_gems.any? &&\n(direct_sibling_local ||": [ - { - "file": "Gemfile", - "lines": [ - 35, - 79, - 119, - 159, - 199, - 239, - 279, - 319, - 359, - 399 - ] - } - ], - "if direct_sibling_templating && !direct_sibling_local\nif direct_sibling_dev_was_set": [ - { - "file": "Gemfile", - "lines": [ - 69, - 109, - 149, - 189, - 229, - 269, - 309, - 349, - 389, - 429 - ] - } - ], - "nomono_activation_requirements = nomono_requirements\nnomono_lockfile = File.expand_path('Gemfile.lock', __dir__)": [ - { - "file": "Gemfile", - "lines": [ - 85, - 125, - 165, - 205, - 245, - 285, - 325, - 365, - 405 - ] - } - ], - "nomono_locked = nomono_locked_spec &&\nGem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)": [ - { - "file": "Gemfile", - "lines": [ - 48, - 92, - 132, - 172, - 212, - 252, - 292, - 332, - 372, - 412 - ] - } - ], - "nomono_locked_spec = Bundler::LockfileParser\n.new(Bundler.read_file(nomono_lockfile))": [ - { - "file": "Gemfile", - "lines": [ - 44, - 88, - 128, - 168, - 208, - 248, - 288, - 328, - 368, - 408 - ] - } - ], - "nomono_lockfile = File.expand_path('Gemfile.lock', __dir__)\nif File.file?(nomono_lockfile)": [ - { - "file": "Gemfile", - "lines": [ - 86, - 126, - 166, - 206, - 246, - 286, - 326, - 366, - 406 - ] - } - ], - "path_env: 'STRUCTUREDMERGE_DEV',\nroot: %w[src my structuredmerge]": [ - { - "file": "Gemfile", - "lines": [ - 103, - 143, - 183, - 223, - 263, - 303, - 343, - 383, - 423 - ] - } - ], - "prefix: 'STRUCTUREDMERGE',\npath_env: 'STRUCTUREDMERGE_DEV',": [ - { - "file": "Gemfile", - "lines": [ - 102, - 142, - 182, - 222, - 262, - 302, - 342, - 382, - 422 - ] - } - ], - "require 'nomono/bundler'\nENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local": [ - { - "file": "Gemfile", - "lines": [ - 97, - 137, - 177, - 217, - 257, - 297, - 337, - 377, - 417 - ] - } - ], - "rescue LoadError\nwarn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.'": [ - { - "file": "Gemfile", - "lines": [ - 106, - 146, - 186, - 226, - 266, - 306, - 346, - 386, - 426 - ] - } - ], - "vendored_gems_env: 'VENDORED_GEMS',\nvendor_gem_dir_env: 'VENDOR_GEM_DIR',": [ - { - "file": "gemfiles/modular/templating_local.gemfile", - "lines": [ - 60, - 71 - ] - } - ] -} diff --git a/gems/json-merge/.rubocop_gradual.lock b/gems/json-merge/.rubocop_gradual.lock index 1f13b2bf6..f4a704b07 100644 --- a/gems/json-merge/.rubocop_gradual.lock +++ b/gems/json-merge/.rubocop_gradual.lock @@ -1,5 +1,5 @@ { - ".simplecov:3644224046": [ + ".simplecov:2561927861": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], "Rakefile:2931360525": [ @@ -15,13 +15,20 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/cgi/r4/v0.5.gemfile:367169322": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/cgi/vHEAD.gemfile:2729540777": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/erb/r2/v3.0.gemfile:1688285565": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r3/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r3/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], - "gemfiles/modular/erb/r4/v5.0.gemfile:2150258305": [ + "gemfiles/modular/erb/r4/v5.0.gemfile:2394062339": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] ], "gemfiles/modular/erb/vHEAD.gemfile:981929959": [ @@ -57,6 +64,13 @@ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], + "gemfiles/modular/webrick/r4/v1.9.gemfile:3092661193": [ + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], + "gemfiles/modular/webrick/vHEAD.gemfile:3867684682": [ + [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], + [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177602] + ], "gemfiles/modular/x_std_libs.gemfile:2324400122": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177542] ], @@ -66,10 +80,10 @@ "gemfiles/modular/x_std_libs/r3/libs.gemfile:4030570297": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/r4/libs.gemfile:909736663": [ + "gemfiles/modular/x_std_libs/r4/libs.gemfile:732451732": [ [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], - "gemfiles/modular/x_std_libs/vHEAD.gemfile:907917303": [ + "gemfiles/modular/x_std_libs/vHEAD.gemfile:2390363993": [ [1, 1, 0, "Naming/FileName: The name of this source file (`vHEAD.gemfile`) should use snake_case.", 5381], [1, 1, 1, "Style/FrozenStringLiteralComment: Missing frozen string literal comment.", 177600] ], @@ -83,153 +97,157 @@ "lib/json-merge.rb:4173905501": [ [1, 1, 0, "Naming/FileName: The name of this source file (`json-merge.rb`) should use snake_case.", 5381] ], - "lib/json/merge.rb:2128431218": [ + "lib/json/merge.rb:2151511858": [ [11, 3, 12, "Style/Documentation: Missing top-level documentation comment for `module Json::Merge`.", 2866359175], - [11, 3, 9848, "Metrics/ModuleLength: Module has too many lines. [271/100]", 4082365503], - [21, 5, 16, "Style/Documentation: Missing top-level documentation comment for `class Json::Merge::ParseError`.", 362242086], - [65, 5, 941, "Metrics/AbcSize: Assignment Branch Condition size for `parse_json` is too high. [<3, 19, 9> 21.24/17]", 2519832432], - [65, 5, 941, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `parse_json` is too high. [8/7]", 2519832432], - [65, 5, 941, "Metrics/MethodLength: Method has too many lines. [24/10]", 2519832432], - [98, 5, 780, "Metrics/MethodLength: Method has too many lines. [17/10]", 3747710599], - [131, 5, 621, "Metrics/AbcSize: Assignment Branch Condition size for `json_value_for_source` is too high. [<3, 17, 7> 18.63/17]", 3652201615], - [131, 5, 621, "Metrics/MethodLength: Method has too many lines. [11/10]", 3652201615], - [147, 5, 759, "Metrics/AbcSize: Assignment Branch Condition size for `json_value_for_node` is too high. [<6, 21, 12> 24.92/17]", 2618715974], - [147, 5, 759, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `json_value_for_node` is too high. [13/7]", 2618715974], - [147, 5, 759, "Metrics/MethodLength: Method has too many lines. [23/10]", 2618715974], - [174, 5, 555, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `decode_json_string_literal` is too high. [11/7]", 4144578840], - [174, 5, 555, "Metrics/MethodLength: Method has too many lines. [16/10]", 4144578840], - [238, 5, 691, "Metrics/MethodLength: Method has too many lines. [18/10]", 4010630320], - [261, 5, 528, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `detect_trailing_comma` is too high. [8/7]", 4057979016], - [261, 5, 528, "Metrics/MethodLength: Method has too many lines. [13/10]", 4057979016], - [302, 5, 787, "Metrics/AbcSize: Assignment Branch Condition size for `advance_scanner_state` is too high. [<8, 12, 24> 28/17]", 2437181548], - [302, 5, 787, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `advance_scanner_state` is too high. [15/7]", 2437181548], - [302, 5, 787, "Metrics/MethodLength: Method has too many lines. [25/10]", 2437181548], - [302, 5, 787, "Metrics/PerceivedComplexity: Perceived complexity for `advance_scanner_state` is too high. [17/8]", 2437181548] + [11, 3, 12802, "Metrics/ModuleLength: Module has too many lines. [334/100]", 566354264], + [22, 5, 16, "Style/Documentation: Missing top-level documentation comment for `class Json::Merge::ParseError`.", 362242086], + [98, 5, 1229, "Metrics/AbcSize: Assignment Branch Condition size for `parse_json` is too high. [<5, 25, 12> 28.18/17]", 394834376], + [98, 5, 1229, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `parse_json` is too high. [10/7]", 394834376], + [98, 5, 1229, "Metrics/MethodLength: Method has too many lines. [28/10]", 394834376], + [98, 5, 1229, "Metrics/PerceivedComplexity: Perceived complexity for `parse_json` is too high. [10/8]", 394834376], + [136, 5, 1108, "Metrics/AbcSize: Assignment Branch Condition size for `merge_json` is too high. [<5, 16, 8> 18.57/17]", 1498407077], + [136, 5, 1108, "Metrics/MethodLength: Method has too many lines. [21/10]", 1498407077], + [174, 5, 892, "Metrics/AbcSize: Assignment Branch Condition size for `json_value_for_source` is too high. [<5, 23, 10> 25.57/17]", 3396869483], + [174, 5, 892, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `json_value_for_source` is too high. [9/7]", 3396869483], + [174, 5, 892, "Metrics/MethodLength: Method has too many lines. [15/10]", 3396869483], + [174, 5, 892, "Metrics/PerceivedComplexity: Perceived complexity for `json_value_for_source` is too high. [9/8]", 3396869483], + [195, 5, 759, "Metrics/AbcSize: Assignment Branch Condition size for `json_value_for_node` is too high. [<6, 21, 12> 24.92/17]", 2618715974], + [195, 5, 759, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `json_value_for_node` is too high. [13/7]", 2618715974], + [195, 5, 759, "Metrics/MethodLength: Method has too many lines. [23/10]", 2618715974], + [222, 5, 555, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `decode_json_string_literal` is too high. [11/7]", 4144578840], + [222, 5, 555, "Metrics/MethodLength: Method has too many lines. [16/10]", 4144578840], + [315, 5, 691, "Metrics/MethodLength: Method has too many lines. [18/10]", 4010630320], + [338, 5, 528, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `detect_trailing_comma` is too high. [8/7]", 4057979016], + [338, 5, 528, "Metrics/MethodLength: Method has too many lines. [13/10]", 4057979016], + [379, 5, 787, "Metrics/AbcSize: Assignment Branch Condition size for `advance_scanner_state` is too high. [<8, 12, 24> 28/17]", 2437181548], + [379, 5, 787, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `advance_scanner_state` is too high. [15/7]", 2437181548], + [379, 5, 787, "Metrics/MethodLength: Method has too many lines. [25/10]", 2437181548], + [379, 5, 787, "Metrics/PerceivedComplexity: Perceived complexity for `advance_scanner_state` is too high. [17/8]", 2437181548] ], "lib/json/merge/comment_tracker.rb:3472563198": [ [19, 48, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765] ], - "lib/json/merge/conflict_resolver.rb:301712181": [ - [11, 5, 55081, "Metrics/ClassLength: Class has too many lines. [1053/100]", 4044265605], - [33, 7, 998, "Metrics/MethodLength: Method has too many lines. [16/10]", 2622185411], - [33, 21, 308, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [12/5]", 958959236], - [34, 121, 95, "Layout/LineLength: Line is too long. [215/120]", 3448296820], - [58, 7, 1143, "Metrics/MethodLength: Method has too many lines. [21/10]", 2302471255], - [107, 7, 4969, "Metrics/AbcSize: Assignment Branch Condition size for `merge_node_lists_to_emitter` is too high. [<29, 62, 22> 71.9/17]", 3145241362], - [107, 7, 4969, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `merge_node_lists_to_emitter` is too high. [20/7]", 3145241362], - [107, 7, 4969, "Metrics/MethodLength: Method has too many lines. [82/10]", 3145241362], - [107, 7, 4969, "Metrics/PerceivedComplexity: Perceived complexity for `merge_node_lists_to_emitter` is too high. [22/8]", 3145241362], - [146, 9, 2759, "Metrics/BlockLength: Block has too many lines. [50/25]", 385678694], - [239, 7, 5585, "Metrics/AbcSize: Assignment Branch Condition size for `merge_matched_nodes_to_emitter` is too high. [<15, 45, 20> 51.48/17]", 3947285535], - [239, 7, 5585, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `merge_matched_nodes_to_emitter` is too high. [17/7]", 3947285535], - [239, 7, 5585, "Metrics/MethodLength: Method has too many lines. [102/10]", 3947285535], - [239, 7, 5585, "Metrics/PerceivedComplexity: Perceived complexity for `merge_matched_nodes_to_emitter` is too high. [21/8]", 3947285535], - [277, 13, 1934, "Metrics/BlockLength: Block has too many lines. [31/25]", 884303795], - [306, 17, 181, "Metrics/BlockNesting: Avoid more than 3 levels of block nesting.", 898629436], - [363, 7, 895, "Metrics/MethodLength: Method has too many lines. [23/10]", 2982353847], - [392, 7, 718, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `preference_for_pair` is too high. [8/7]", 3339910669], - [392, 7, 718, "Metrics/MethodLength: Method has too many lines. [12/10]", 3339910669], - [418, 7, 1636, "Metrics/MethodLength: Method has too many lines. [37/10]", 514235298], - [473, 25, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], - [493, 7, 5501, "Metrics/AbcSize: Assignment Branch Condition size for `emit_node` is too high. [<18, 82, 31> 89.49/17]", 1826498333], - [493, 7, 5501, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_node` is too high. [29/7]", 1826498333], - [493, 7, 5501, "Metrics/MethodLength: Method has too many lines. [109/10]", 1826498333], - [493, 7, 5501, "Metrics/PerceivedComplexity: Perceived complexity for `emit_node` is too high. [36/8]", 1826498333], - [522, 15, 1572, "Metrics/BlockNesting: Avoid more than 3 levels of block nesting.", 3256756034], - [554, 15, 654, "Metrics/BlockNesting: Avoid more than 3 levels of block nesting.", 3730688879], - [569, 17, 287, "Metrics/BlockNesting: Avoid more than 3 levels of block nesting.", 3369588943], - [618, 7, 1424, "Metrics/AbcSize: Assignment Branch Condition size for `emit_atomic_node` is too high. [<7, 14, 7> 17.15/17]", 776263089], - [618, 7, 1424, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_atomic_node` is too high. [8/7]", 776263089], - [618, 7, 1424, "Metrics/MethodLength: Method has too many lines. [22/10]", 776263089], - [666, 7, 242, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `recursively_merge_pair_values?` is too high. [8/7]", 3319997574], - [682, 7, 1642, "Metrics/AbcSize: Assignment Branch Condition size for `preferred_available_inline_attachment` is too high. [<14, 14, 14> 24.25/17]", 1854381957], - [682, 7, 1642, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `preferred_available_inline_attachment` is too high. [13/7]", 1854381957], - [682, 7, 1642, "Metrics/MethodLength: Method has too many lines. [27/10]", 1854381957], - [682, 7, 1642, "Metrics/PerceivedComplexity: Perceived complexity for `preferred_available_inline_attachment` is too high. [14/8]", 1854381957], - [682, 48, 154, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 358586640], - [687, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 4196003793], - [719, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177548], - [725, 33, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], - [730, 7, 1761, "Metrics/AbcSize: Assignment Branch Condition size for `emit_preferred_leading_comments_for` is too high. [<4, 39, 16> 42.34/17]", 1923098835], - [730, 7, 1761, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_preferred_leading_comments_for` is too high. [16/7]", 1923098835], - [730, 7, 1761, "Metrics/MethodLength: Method has too many lines. [26/10]", 1923098835], - [730, 7, 1761, "Metrics/PerceivedComplexity: Perceived complexity for `emit_preferred_leading_comments_for` is too high. [17/8]", 1923098835], - [764, 7, 1600, "Metrics/AbcSize: Assignment Branch Condition size for `emit_leading_comments_for` is too high. [<5, 37, 10> 38.65/17]", 2686936477], - [764, 7, 1600, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_leading_comments_for` is too high. [11/7]", 2686936477], - [764, 7, 1600, "Metrics/MethodLength: Method has too many lines. [26/10]", 2686936477], - [764, 7, 1600, "Metrics/PerceivedComplexity: Perceived complexity for `emit_leading_comments_for` is too high. [11/8]", 2686936477], - [765, 27, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], - [799, 7, 1573, "Metrics/AbcSize: Assignment Branch Condition size for `canonical_leading_comment_region` is too high. [<8, 28, 14> 32.31/17]", 151098026], - [799, 7, 1573, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `canonical_leading_comment_region` is too high. [12/7]", 151098026], - [799, 7, 1573, "Metrics/MethodLength: Method has too many lines. [29/10]", 151098026], - [799, 7, 1573, "Metrics/PerceivedComplexity: Perceived complexity for `canonical_leading_comment_region` is too high. [12/8]", 151098026], - [837, 7, 1315, "Metrics/AbcSize: Assignment Branch Condition size for `canonical_tracked_leading_comments` is too high. [<8, 21, 12> 25.48/17]", 3806475230], - [837, 7, 1315, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `canonical_tracked_leading_comments` is too high. [11/7]", 3806475230], - [837, 7, 1315, "Metrics/MethodLength: Method has too many lines. [21/10]", 3806475230], - [837, 7, 1315, "Metrics/PerceivedComplexity: Perceived complexity for `canonical_tracked_leading_comments` is too high. [11/8]", 3806475230], - [867, 27, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], - [872, 7, 574, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `dedup_warning_context` is too high. [9/7]", 840557709], - [872, 7, 574, "Metrics/PerceivedComplexity: Perceived complexity for `dedup_warning_context` is too high. [9/8]", 840557709], - [875, 27, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], - [876, 48, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], - [877, 48, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], - [917, 7, 687, "Metrics/AbcSize: Assignment Branch Condition size for `equivalent_owner?` is too high. [<0, 17, 19> 25.5/17]", 1122406222], - [917, 7, 687, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `equivalent_owner?` is too high. [15/7]", 1122406222], - [917, 7, 687, "Metrics/MethodLength: Method has too many lines. [14/10]", 1122406222], - [917, 7, 687, "Metrics/PerceivedComplexity: Perceived complexity for `equivalent_owner?` is too high. [16/8]", 1122406222], - [957, 7, 762, "Metrics/MethodLength: Method has too many lines. [13/10]", 341822255], - [976, 7, 701, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `shared_line_comment_attachment_for` is too high. [9/7]", 2431043907], - [976, 7, 701, "Metrics/MethodLength: Method has too many lines. [13/10]", 2431043907], - [976, 7, 701, "Metrics/PerceivedComplexity: Perceived complexity for `shared_line_comment_attachment_for` is too high. [9/8]", 2431043907], - [1018, 7, 617, "Metrics/AbcSize: Assignment Branch Condition size for `emit_container_trailing_lines` is too high. [<2, 17, 3> 17.38/17]", 2119480325], - [1043, 7, 723, "Metrics/AbcSize: Assignment Branch Condition size for `trailing_container_line_range` is too high. [<4, 15, 11> 19.03/17]", 3162486186], - [1043, 7, 723, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `trailing_container_line_range` is too high. [10/7]", 3162486186], - [1043, 7, 723, "Metrics/MethodLength: Method has too many lines. [13/10]", 3162486186], - [1043, 7, 723, "Metrics/PerceivedComplexity: Perceived complexity for `trailing_container_line_range` is too high. [11/8]", 3162486186], - [1061, 7, 503, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_comment_and_blank_lines_in_range` is too high. [9/7]", 2774366077], - [1061, 7, 503, "Metrics/MethodLength: Method has too many lines. [11/10]", 2774366077], - [1061, 7, 503, "Metrics/PerceivedComplexity: Perceived complexity for `emit_comment_and_blank_lines_in_range` is too high. [9/8]", 2774366077], - [1108, 7, 945, "Metrics/MethodLength: Method has too many lines. [14/10]", 1167897124], - [1155, 7, 832, "Metrics/AbcSize: Assignment Branch Condition size for `removed_inline_block_comment_at` is too high. [<6, 26, 7> 27.59/17]", 890096863], - [1155, 7, 832, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `removed_inline_block_comment_at` is too high. [8/7]", 890096863], - [1155, 7, 832, "Metrics/MethodLength: Method has too many lines. [19/10]", 890096863], - [1212, 7, 1587, "Metrics/AbcSize: Assignment Branch Condition size for `emit_document_prelude` is too high. [<12, 40, 22> 47.2/17]", 1354199117], - [1212, 7, 1587, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_document_prelude` is too high. [21/7]", 1354199117], - [1212, 7, 1587, "Metrics/MethodLength: Method has too many lines. [35/10]", 1354199117], - [1212, 7, 1587, "Metrics/PerceivedComplexity: Perceived complexity for `emit_document_prelude` is too high. [22/8]", 1354199117], - [1256, 7, 1281, "Metrics/AbcSize: Assignment Branch Condition size for `emit_document_postlude` is too high. [<9, 31, 21> 38.51/17]", 1869501446], - [1256, 7, 1281, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_document_postlude` is too high. [20/7]", 1869501446], - [1256, 7, 1281, "Metrics/MethodLength: Method has too many lines. [23/10]", 1869501446], - [1256, 7, 1281, "Metrics/PerceivedComplexity: Perceived complexity for `emit_document_postlude` is too high. [20/8]", 1869501446], - [1276, 121, 104, "Layout/LineLength: Line is too long. [224/120]", 1511565389], - [1288, 9, 48, "Lint/HashCompareByIdentity: Use `Hash#compare_by_identity` instead of using `object_id` for keys.", 2339197345], - [1334, 7, 1002, "Metrics/AbcSize: Assignment Branch Condition size for `build_refined_matches` is too high. [<11, 16, 8> 21/17]", 2274245926], - [1334, 7, 1002, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `build_refined_matches` is too high. [9/7]", 2274245926], - [1334, 7, 1002, "Metrics/MethodLength: Method has too many lines. [18/10]", 2274245926], - [1334, 7, 1002, "Metrics/PerceivedComplexity: Perceived complexity for `build_refined_matches` is too high. [9/8]", 2274245926] + "lib/json/merge/conflict_resolver.rb:2212606577": [ + [11, 5, 56081, "Metrics/ClassLength: Class has too many lines. [1067/100]", 2246754139], + [34, 7, 998, "Metrics/MethodLength: Method has too many lines. [16/10]", 2622185411], + [34, 21, 308, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [12/5]", 958959236], + [35, 121, 95, "Layout/LineLength: Line is too long. [215/120]", 3448296820], + [59, 7, 1143, "Metrics/MethodLength: Method has too many lines. [21/10]", 2302471255], + [108, 7, 5125, "Metrics/AbcSize: Assignment Branch Condition size for `merge_node_lists_to_emitter` is too high. [<29, 62, 22> 71.9/17]", 2413236296], + [108, 7, 5125, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `merge_node_lists_to_emitter` is too high. [20/7]", 2413236296], + [108, 7, 5125, "Metrics/MethodLength: Method has too many lines. [84/10]", 2413236296], + [108, 7, 5125, "Metrics/PerceivedComplexity: Perceived complexity for `merge_node_lists_to_emitter` is too high. [22/8]", 2413236296], + [108, 101, 11, "Lint/UnusedMethodArgument: Unused method argument - `dest_owners`.", 3374450542], + [147, 9, 2897, "Metrics/BlockLength: Block has too many lines. [52/25]", 385678694], + [242, 7, 5852, "Metrics/AbcSize: Assignment Branch Condition size for `merge_matched_nodes_to_emitter` is too high. [<15, 48, 22> 54.89/17]", 1313596093], + [242, 7, 5852, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `merge_matched_nodes_to_emitter` is too high. [18/7]", 1313596093], + [242, 7, 5852, "Metrics/MethodLength: Method has too many lines. [106/10]", 1313596093], + [242, 7, 5852, "Metrics/PerceivedComplexity: Perceived complexity for `merge_matched_nodes_to_emitter` is too high. [22/8]", 1313596093], + [284, 13, 1996, "Metrics/BlockLength: Block has too many lines. [32/25]", 884303795], + [314, 17, 181, "Metrics/BlockNesting: Avoid more than 3 levels of block nesting.", 898629436], + [380, 7, 895, "Metrics/MethodLength: Method has too many lines. [23/10]", 2982353847], + [409, 7, 718, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `preference_for_pair` is too high. [8/7]", 3339910669], + [409, 7, 718, "Metrics/MethodLength: Method has too many lines. [12/10]", 3339910669], + [435, 7, 1636, "Metrics/MethodLength: Method has too many lines. [37/10]", 514235298], + [490, 25, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [510, 7, 5501, "Metrics/AbcSize: Assignment Branch Condition size for `emit_node` is too high. [<18, 82, 31> 89.49/17]", 1826498333], + [510, 7, 5501, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_node` is too high. [29/7]", 1826498333], + [510, 7, 5501, "Metrics/MethodLength: Method has too many lines. [109/10]", 1826498333], + [510, 7, 5501, "Metrics/PerceivedComplexity: Perceived complexity for `emit_node` is too high. [36/8]", 1826498333], + [539, 15, 1572, "Metrics/BlockNesting: Avoid more than 3 levels of block nesting.", 3256756034], + [571, 15, 654, "Metrics/BlockNesting: Avoid more than 3 levels of block nesting.", 3730688879], + [586, 17, 287, "Metrics/BlockNesting: Avoid more than 3 levels of block nesting.", 3369588943], + [635, 7, 1424, "Metrics/AbcSize: Assignment Branch Condition size for `emit_atomic_node` is too high. [<7, 14, 7> 17.15/17]", 776263089], + [635, 7, 1424, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_atomic_node` is too high. [8/7]", 776263089], + [635, 7, 1424, "Metrics/MethodLength: Method has too many lines. [22/10]", 776263089], + [683, 7, 242, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `recursively_merge_pair_values?` is too high. [8/7]", 3319997574], + [699, 7, 1642, "Metrics/AbcSize: Assignment Branch Condition size for `preferred_available_inline_attachment` is too high. [<14, 14, 14> 24.25/17]", 1854381957], + [699, 7, 1642, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `preferred_available_inline_attachment` is too high. [13/7]", 1854381957], + [699, 7, 1642, "Metrics/MethodLength: Method has too many lines. [27/10]", 1854381957], + [699, 7, 1642, "Metrics/PerceivedComplexity: Perceived complexity for `preferred_available_inline_attachment` is too high. [14/8]", 1854381957], + [699, 48, 154, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 358586640], + [704, 121, 18, "Layout/LineLength: Line is too long. [138/120]", 4196003793], + [736, 121, 1, "Layout/LineLength: Line is too long. [121/120]", 177548], + [742, 33, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [747, 7, 1761, "Metrics/AbcSize: Assignment Branch Condition size for `emit_preferred_leading_comments_for` is too high. [<4, 39, 16> 42.34/17]", 1923098835], + [747, 7, 1761, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_preferred_leading_comments_for` is too high. [16/7]", 1923098835], + [747, 7, 1761, "Metrics/MethodLength: Method has too many lines. [26/10]", 1923098835], + [747, 7, 1761, "Metrics/PerceivedComplexity: Perceived complexity for `emit_preferred_leading_comments_for` is too high. [17/8]", 1923098835], + [781, 7, 1600, "Metrics/AbcSize: Assignment Branch Condition size for `emit_leading_comments_for` is too high. [<5, 37, 10> 38.65/17]", 2686936477], + [781, 7, 1600, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_leading_comments_for` is too high. [11/7]", 2686936477], + [781, 7, 1600, "Metrics/MethodLength: Method has too many lines. [26/10]", 2686936477], + [781, 7, 1600, "Metrics/PerceivedComplexity: Perceived complexity for `emit_leading_comments_for` is too high. [11/8]", 2686936477], + [782, 27, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [816, 7, 1573, "Metrics/AbcSize: Assignment Branch Condition size for `canonical_leading_comment_region` is too high. [<8, 28, 14> 32.31/17]", 151098026], + [816, 7, 1573, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `canonical_leading_comment_region` is too high. [12/7]", 151098026], + [816, 7, 1573, "Metrics/MethodLength: Method has too many lines. [29/10]", 151098026], + [816, 7, 1573, "Metrics/PerceivedComplexity: Perceived complexity for `canonical_leading_comment_region` is too high. [12/8]", 151098026], + [854, 7, 1315, "Metrics/AbcSize: Assignment Branch Condition size for `canonical_tracked_leading_comments` is too high. [<8, 21, 12> 25.48/17]", 3806475230], + [854, 7, 1315, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `canonical_tracked_leading_comments` is too high. [11/7]", 3806475230], + [854, 7, 1315, "Metrics/MethodLength: Method has too many lines. [21/10]", 3806475230], + [854, 7, 1315, "Metrics/PerceivedComplexity: Perceived complexity for `canonical_tracked_leading_comments` is too high. [11/8]", 3806475230], + [884, 27, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [889, 7, 574, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `dedup_warning_context` is too high. [9/7]", 840557709], + [889, 7, 574, "Metrics/PerceivedComplexity: Perceived complexity for `dedup_warning_context` is too high. [9/8]", 840557709], + [892, 27, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [893, 48, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [894, 48, 2, "Lint/RedundantSafeNavigation: Redundant safe navigation detected, use `.` instead.", 5858765], + [934, 7, 687, "Metrics/AbcSize: Assignment Branch Condition size for `equivalent_owner?` is too high. [<0, 17, 19> 25.5/17]", 1122406222], + [934, 7, 687, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `equivalent_owner?` is too high. [15/7]", 1122406222], + [934, 7, 687, "Metrics/MethodLength: Method has too many lines. [14/10]", 1122406222], + [934, 7, 687, "Metrics/PerceivedComplexity: Perceived complexity for `equivalent_owner?` is too high. [16/8]", 1122406222], + [974, 7, 762, "Metrics/MethodLength: Method has too many lines. [13/10]", 341822255], + [993, 7, 701, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `shared_line_comment_attachment_for` is too high. [9/7]", 2431043907], + [993, 7, 701, "Metrics/MethodLength: Method has too many lines. [13/10]", 2431043907], + [993, 7, 701, "Metrics/PerceivedComplexity: Perceived complexity for `shared_line_comment_attachment_for` is too high. [9/8]", 2431043907], + [1035, 7, 617, "Metrics/AbcSize: Assignment Branch Condition size for `emit_container_trailing_lines` is too high. [<2, 17, 3> 17.38/17]", 2119480325], + [1060, 7, 723, "Metrics/AbcSize: Assignment Branch Condition size for `trailing_container_line_range` is too high. [<4, 15, 11> 19.03/17]", 3162486186], + [1060, 7, 723, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `trailing_container_line_range` is too high. [10/7]", 3162486186], + [1060, 7, 723, "Metrics/MethodLength: Method has too many lines. [13/10]", 3162486186], + [1060, 7, 723, "Metrics/PerceivedComplexity: Perceived complexity for `trailing_container_line_range` is too high. [11/8]", 3162486186], + [1078, 7, 503, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_comment_and_blank_lines_in_range` is too high. [9/7]", 2774366077], + [1078, 7, 503, "Metrics/MethodLength: Method has too many lines. [11/10]", 2774366077], + [1078, 7, 503, "Metrics/PerceivedComplexity: Perceived complexity for `emit_comment_and_blank_lines_in_range` is too high. [9/8]", 2774366077], + [1125, 7, 945, "Metrics/MethodLength: Method has too many lines. [14/10]", 1167897124], + [1172, 7, 832, "Metrics/AbcSize: Assignment Branch Condition size for `removed_inline_block_comment_at` is too high. [<6, 26, 7> 27.59/17]", 890096863], + [1172, 7, 832, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `removed_inline_block_comment_at` is too high. [8/7]", 890096863], + [1172, 7, 832, "Metrics/MethodLength: Method has too many lines. [19/10]", 890096863], + [1229, 7, 1587, "Metrics/AbcSize: Assignment Branch Condition size for `emit_document_prelude` is too high. [<12, 40, 22> 47.2/17]", 1354199117], + [1229, 7, 1587, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_document_prelude` is too high. [21/7]", 1354199117], + [1229, 7, 1587, "Metrics/MethodLength: Method has too many lines. [35/10]", 1354199117], + [1229, 7, 1587, "Metrics/PerceivedComplexity: Perceived complexity for `emit_document_prelude` is too high. [22/8]", 1354199117], + [1273, 7, 1281, "Metrics/AbcSize: Assignment Branch Condition size for `emit_document_postlude` is too high. [<9, 31, 21> 38.51/17]", 1869501446], + [1273, 7, 1281, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `emit_document_postlude` is too high. [20/7]", 1869501446], + [1273, 7, 1281, "Metrics/MethodLength: Method has too many lines. [23/10]", 1869501446], + [1273, 7, 1281, "Metrics/PerceivedComplexity: Perceived complexity for `emit_document_postlude` is too high. [20/8]", 1869501446], + [1293, 121, 104, "Layout/LineLength: Line is too long. [224/120]", 1511565389], + [1305, 9, 48, "Lint/HashCompareByIdentity: Use `Hash#compare_by_identity` instead of using `object_id` for keys.", 2339197345], + [1351, 7, 1002, "Metrics/AbcSize: Assignment Branch Condition size for `build_refined_matches` is too high. [<11, 16, 8> 21/17]", 2274245926], + [1351, 7, 1002, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `build_refined_matches` is too high. [9/7]", 2274245926], + [1351, 7, 1002, "Metrics/MethodLength: Method has too many lines. [18/10]", 2274245926], + [1351, 7, 1002, "Metrics/PerceivedComplexity: Perceived complexity for `build_refined_matches` is too high. [9/8]", 2274245926] ], "lib/json/merge/emitter.rb:3208422098": [ [16, 5, 6329, "Metrics/ClassLength: Class has too many lines. [140/100]", 1868859478], [183, 7, 586, "Metrics/MethodLength: Method has too many lines. [14/10]", 4015595961] ], - "lib/json/merge/file_analysis.rb:1768951794": [ - [7, 5, 8750, "Metrics/ClassLength: Class has too many lines. [234/100]", 3986988439], + "lib/json/merge/file_analysis.rb:2615144059": [ + [7, 5, 8534, "Metrics/ClassLength: Class has too many lines. [231/100]", 1552473597], [20, 7, 897, "Metrics/MethodLength: Method has too many lines. [16/10]", 2945813957], [83, 9, 6, "Naming/MemoizedInstanceVariableName: Memoized variable `@nodes` does not match method name `statements`. Use `@statements` instead.", 2756313398], [182, 7, 530, "Metrics/MethodLength: Method has too many lines. [12/10]", 2217856870], - [202, 7, 601, "Metrics/MethodLength: Method has too many lines. [13/10]", 1694972597], - [222, 7, 679, "Metrics/AbcSize: Assignment Branch Condition size for `collect_parse_errors` is too high. [<1, 19, 11> 21.98/17]", 1780421309], - [222, 7, 679, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `collect_parse_errors` is too high. [11/7]", 1780421309], - [222, 7, 679, "Metrics/MethodLength: Method has too many lines. [13/10]", 1780421309], - [222, 7, 679, "Metrics/PerceivedComplexity: Perceived complexity for `collect_parse_errors` is too high. [11/8]", 1780421309], - [239, 7, 1373, "Metrics/AbcSize: Assignment Branch Condition size for `extract_freeze_blocks` is too high. [<16, 23, 14> 31.32/17]", 2629976180], - [239, 7, 1373, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `extract_freeze_blocks` is too high. [12/7]", 2629976180], - [239, 7, 1373, "Metrics/MethodLength: Method has too many lines. [33/10]", 2629976180], - [239, 7, 1373, "Metrics/PerceivedComplexity: Perceived complexity for `extract_freeze_blocks` is too high. [14/8]", 2629976180], - [283, 7, 575, "Metrics/AbcSize: Assignment Branch Condition size for `integrate_nodes_and_freeze_blocks` is too high. [<8, 19, 10> 22.91/17]", 1313409663], - [283, 7, 575, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `integrate_nodes_and_freeze_blocks` is too high. [11/7]", 1313409663], - [283, 7, 575, "Metrics/MethodLength: Method has too many lines. [13/10]", 1313409663], - [283, 7, 575, "Metrics/PerceivedComplexity: Perceived complexity for `integrate_nodes_and_freeze_blocks` is too high. [11/8]", 1313409663] + [217, 7, 679, "Metrics/AbcSize: Assignment Branch Condition size for `collect_parse_errors` is too high. [<1, 19, 11> 21.98/17]", 1780421309], + [217, 7, 679, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `collect_parse_errors` is too high. [11/7]", 1780421309], + [217, 7, 679, "Metrics/MethodLength: Method has too many lines. [13/10]", 1780421309], + [217, 7, 679, "Metrics/PerceivedComplexity: Perceived complexity for `collect_parse_errors` is too high. [11/8]", 1780421309], + [234, 7, 1373, "Metrics/AbcSize: Assignment Branch Condition size for `extract_freeze_blocks` is too high. [<16, 23, 14> 31.32/17]", 2629976180], + [234, 7, 1373, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `extract_freeze_blocks` is too high. [12/7]", 2629976180], + [234, 7, 1373, "Metrics/MethodLength: Method has too many lines. [33/10]", 2629976180], + [234, 7, 1373, "Metrics/PerceivedComplexity: Perceived complexity for `extract_freeze_blocks` is too high. [14/8]", 2629976180], + [278, 7, 575, "Metrics/AbcSize: Assignment Branch Condition size for `integrate_nodes_and_freeze_blocks` is too high. [<8, 19, 10> 22.91/17]", 1313409663], + [278, 7, 575, "Metrics/CyclomaticComplexity: Cyclomatic complexity for `integrate_nodes_and_freeze_blocks` is too high. [11/7]", 1313409663], + [278, 7, 575, "Metrics/MethodLength: Method has too many lines. [13/10]", 1313409663], + [278, 7, 575, "Metrics/PerceivedComplexity: Perceived complexity for `integrate_nodes_and_freeze_blocks` is too high. [11/8]", 1313409663] ], "lib/json/merge/freeze_node.rb:340454761": [ [11, 21, 97, "Metrics/ParameterLists: Avoid parameter lists longer than 5 parameters. [6/5]", 4181995290] @@ -271,13 +289,17 @@ [188, 7, 574, "Metrics/MethodLength: Method has too many lines. [13/10]", 1857730257], [221, 7, 1053, "Metrics/MethodLength: Method has too many lines. [24/10]", 3329630813] ], - "spec/fixtures_integration_spec.rb:2941021946": [ - [3, 1, 7914, "Metrics/BlockLength: Block has too many lines. [163/25]", 4258553307], - [85, 60, 25, "Style/SymbolProc: Pass `&:compact` as an argument to `map` instead of a block.", 2107480170], - [93, 59, 25, "Style/SymbolProc: Pass `&:compact` as an argument to `map` instead of a block.", 2107480170], - [157, 3, 801, "Metrics/BlockLength: Block has too many lines. [27/25]", 716259872] + "spec/fixtures_integration_spec.rb:4153476545": [ + [3, 1, 9054, "Metrics/BlockLength: Block has too many lines. [188/25]", 3333617620], + [61, 23, 55, "Style/SingleArgumentDig: Use `described_class.json_plan_context[:feature_profile]` instead of `described_class.json_plan_context.dig(:feature_profile)`.", 2689605560], + [115, 60, 25, "Style/SymbolProc: Pass `&:compact` as an argument to `map` instead of a block.", 2107480170], + [123, 59, 25, "Style/SymbolProc: Pass `&:compact` as an argument to `map` instead of a block.", 2107480170], + [187, 3, 801, "Metrics/BlockLength: Block has too many lines. [27/25]", 716259872] ], "spec/reproducible_merge_spec.rb:133932627": [ [5, 1, 1854, "Metrics/BlockLength: Block has too many lines. [40/25]", 671932104] + ], + "spec/retained_blank_gap_spec.rb:488689672": [ + [6, 1, 1126, "Metrics/BlockLength: Block has too many lines. [48/25]", 1659685169] ] } diff --git a/gems/json-merge/.simplecov b/gems/json-merge/.simplecov index 7a28b141e..65351a88c 100644 --- a/gems/json-merge/.simplecov +++ b/gems/json-merge/.simplecov @@ -4,15 +4,11 @@ # json-merge will then preserve content between those markers across template runs. # kettle-jem:unfreeze -require 'kettle/soup/cover/config' - # Minimum coverage thresholds are set by kettle-soup-cover. # They are controlled by ENV variables loaded by `mise` from `mise.toml` # (with optional machine-local overrides in `.env.local`). # If the values for minimum coverage need to change, they should be changed both there, # and in 2 places in .github/workflows/coverage.yml. -SimpleCov.start do - track_files 'lib/**/*.rb' - track_files 'lib/**/*.rake' - track_files 'exe/*.rb' +SimpleCov.configure do + cover 'lib/**/*.rb', 'lib/**/*.rake', 'exe/*.rb' end diff --git a/gems/json-merge/.structuredmerge/kettle-jem.yml b/gems/json-merge/.structuredmerge/kettle-jem.yml index cf9684e3b..adc4b3666 100644 --- a/gems/json-merge/.structuredmerge/kettle-jem.yml +++ b/gems/json-merge/.structuredmerge/kettle-jem.yml @@ -246,6 +246,59 @@ templates: - Gemfile - certs/pboling.pem - tmp/.gitignore + - gemfiles/modular/benchmark/r4/v0.5.gemfile + - gemfiles/modular/benchmark/vHEAD.gemfile + - gemfiles/modular/cgi/r4/v0.5.gemfile + - gemfiles/modular/cgi/vHEAD.gemfile + - gemfiles/modular/coverage.gemfile + - gemfiles/modular/coverage_local.gemfile + - gemfiles/modular/debug.gemfile + - gemfiles/modular/documentation.gemfile + - gemfiles/modular/documentation_local.gemfile + - gemfiles/modular/erb/r2.3/default.gemfile + - gemfiles/modular/erb/r2.6/v2.2.gemfile + - gemfiles/modular/erb/r2/v3.0.gemfile + - gemfiles/modular/erb/r3.1/v4.0.gemfile + - gemfiles/modular/erb/r3/v5.0.gemfile + - gemfiles/modular/erb/r4/v5.0.gemfile + - gemfiles/modular/erb/vHEAD.gemfile + - gemfiles/modular/json/truffleruby_22_3.gemfile + - gemfiles/modular/json/truffleruby_23_0.gemfile + - gemfiles/modular/json/truffleruby_23_1.gemfile + - gemfiles/modular/mutex_m/r2.4/v0.1.gemfile + - gemfiles/modular/mutex_m/r2/v0.3.gemfile + - gemfiles/modular/mutex_m/r3/v0.3.gemfile + - gemfiles/modular/mutex_m/r4/v0.3.gemfile + - gemfiles/modular/mutex_m/vHEAD.gemfile + - gemfiles/modular/optional.gemfile + - gemfiles/modular/recording/r2.3/recording.gemfile + - gemfiles/modular/recording/r2.4/recording.gemfile + - gemfiles/modular/recording/r2.5/recording.gemfile + - gemfiles/modular/recording/r3/recording.gemfile + - gemfiles/modular/recording/r4/recording.gemfile + - gemfiles/modular/recording/vHEAD.gemfile + - gemfiles/modular/rspec.gemfile + - gemfiles/modular/runtime_heads.gemfile + - gemfiles/modular/stringio/r2.4/v0.0.2.gemfile + - gemfiles/modular/stringio/r2/v3.0.gemfile + - gemfiles/modular/stringio/r3/v3.0.gemfile + - gemfiles/modular/stringio/r4/v3.0.gemfile + - gemfiles/modular/stringio/vHEAD.gemfile + - gemfiles/modular/style.gemfile + - gemfiles/modular/style_local.gemfile + - gemfiles/modular/templating.gemfile + - gemfiles/modular/templating_local.gemfile + - gemfiles/modular/webrick/r4/v1.9.gemfile + - gemfiles/modular/webrick/vHEAD.gemfile + - gemfiles/modular/x_std_libs.gemfile + - gemfiles/modular/x_std_libs/r2.3/libs.gemfile + - gemfiles/modular/x_std_libs/r2.4/libs.gemfile + - gemfiles/modular/x_std_libs/r2.6/libs.gemfile + - gemfiles/modular/x_std_libs/r2/libs.gemfile + - gemfiles/modular/x_std_libs/r3.1/libs.gemfile + - gemfiles/modular/x_std_libs/r3/libs.gemfile + - gemfiles/modular/x_std_libs/r4/libs.gemfile + - gemfiles/modular/x_std_libs/vHEAD.gemfile - source: lib/gem/version.rb target: lib/json/merge/version.rb - source: sig/gem.rbs diff --git a/gems/json-merge/Gemfile b/gems/json-merge/Gemfile index 1b8188be8..4bfe324c3 100644 --- a/gems/json-merge/Gemfile +++ b/gems/json-merge/Gemfile @@ -37,260 +37,8 @@ if direct_sibling_gems.any? && ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) + require 'nomono/bundler' begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( @@ -299,8 +47,6 @@ if direct_sibling_gems.any? && path_env: 'STRUCTUREDMERGE_DEV', root: %w[src my structuredmerge] ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -312,142 +58,8 @@ if direct_sibling_gems.any? && end end -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -if direct_sibling_gems.any? && - (direct_sibling_local || - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero?) - direct_sibling_dev_was_set = ENV.key?('STRUCTUREDMERGE_DEV') - direct_sibling_dev_original = ENV.fetch('STRUCTUREDMERGE_DEV', nil) - begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path('Gemfile.lock', __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == 'nomono' } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] if nomono_locked - end - Kernel.send(:gem, 'nomono', *nomono_activation_requirements) - require 'nomono/bundler' - ENV['STRUCTUREDMERGE_DEV'] = File.expand_path('..', __dir__) if direct_sibling_templating && !direct_sibling_local - - eval_nomono_gems( - gems: direct_sibling_gems, - prefix: 'STRUCTUREDMERGE', - path_env: 'STRUCTUREDMERGE_DEV', - root: %w[src my structuredmerge] - ) - rescue LoadError - warn 'Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies.' - ensure - if direct_sibling_templating && !direct_sibling_local - if direct_sibling_dev_was_set - ENV['STRUCTUREDMERGE_DEV'] = direct_sibling_dev_original - else - ENV.delete('STRUCTUREDMERGE_DEV') - end - end - end -end - -# Use the StructuredMerge TSLP branch until upstream ships Ruby 4-compatible gem metadata. -tslp_dev = ENV.fetch('TSLP_DEV', nil) -tslp_declared_by_templating = - ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? && !tslp_dev.to_s.empty? -unless tslp_declared_by_templating - if tslp_dev.to_s.empty? - gem( - 'tree_sitter_language_pack', - git: 'https://github.com/structuredmerge/tree-sitter-language-pack.git', - branch: 'fix/ruby-parser-api-methods', - glob: 'packages/ruby/*.gemspec' - ) - else - gem 'tree_sitter_language_pack', path: tslp_dev - end -end +# Use released TSLP with the Ruby ABI platform-gem fix. +gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' # Templating (env-switched: STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local paths) eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATING', 'false').casecmp('true').zero? @@ -455,7 +67,7 @@ eval_gemfile 'gemfiles/modular/templating.gemfile' if ENV.fetch('K_JEM_TEMPLATIN # Debugging eval_gemfile 'gemfiles/modular/debug.gemfile' -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile 'gemfiles/modular/coverage.gemfile' # Linting diff --git a/gems/json-merge/Gemfile.lock b/gems/json-merge/Gemfile.lock index 9a62cb25c..588b3d1a6 100644 --- a/gems/json-merge/Gemfile.lock +++ b/gems/json-merge/Gemfile.lock @@ -6,272 +6,6 @@ PATH tree_haver (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly - specs: - ast-crispr-markdown-markly (7.1.0) - ast-crispr (= 7.1.0) - markly-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: - ast-crispr-ruby-prism (7.1.0) - ast-crispr (= 7.1.0) - prism-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: - ast-merge (7.1.0) - benchmark - token-resolver (~> 2.0, >= 2.0.4) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: - bash-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem - specs: - kettle-jem (7.1.0) - addressable (>= 2.8, < 3) - ast-crispr-markdown-markly (= 7.1.0) - ast-crispr-ruby-prism (= 7.1.0) - ast-merge (= 7.1.0) - bash-merge (= 7.1.0) - citrus-toml-merge (= 7.1.0) - commonmarker-merge (= 7.1.0) - dotenv-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-dev (~> 2.3, >= 2.3.5) - kettle-rb (~> 0.1, >= 0.1.4) - kramdown-merge (= 7.1.0) - markdown-merge (= 7.1.0) - markly-merge (= 7.1.0) - prism-merge (= 7.1.0) - psych-merge (= 7.1.0) - rbs (>= 3.10) - rbs-merge (= 7.1.0) - ruby-merge (= 7.1.0) - token-resolver (~> 2.0, >= 2.0.4) - toml-merge (= 7.1.0) - toml-rb (~> 4.2) - tree_haver (= 7.1.0) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - GEM remote: https://gem.coop/ specs: @@ -282,22 +16,26 @@ GEM bundler (>= 1.17.3) rake (>= 10) thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) ast (2.4.3) + ast-merge (7.1.0) + benchmark + token-resolver (~> 2.0, >= 2.0.4) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) bundler (>= 1.2.0) thor (~> 1.0) + cgi (0.5.2) citrus (3.0.2) cmdparse (3.0.7) - commonmarker (2.9.0-aarch64-linux) - commonmarker (2.9.0-aarch64-linux-musl) - commonmarker (2.9.0-arm64-darwin) - commonmarker (2.9.0-x86_64-darwin) - commonmarker (2.9.0-x86_64-linux) - commonmarker (2.9.0-x86_64-linux-musl) - concurrent-ruby (1.3.7) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,7 +43,6 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) - docile (1.4.1) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -336,7 +73,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -355,24 +92,20 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (1.1.3) - simplecov (~> 0.22) - simplecov-cobertura (~> 3.0) - simplecov-console (~> 0.9, >= 0.9.3) - simplecov-html (~> 0.13, >= 0.13.1) - simplecov-lcov (~> 0.8) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) + simplecov (>= 1.0) + simplecov-cobertura (>= 4.0) + simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) - simplecov_json_formatter (~> 0.1, >= 0.1.4) - version_gem (~> 1.1, >= 1.1.9) - kettle-test (2.0.11) + simplecov_lcov_formatter (~> 0.9, >= 0.9.0) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -383,6 +116,8 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) kramdown-parser-gfm (1.1.0) @@ -390,7 +125,6 @@ GEM language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) - markly (0.16.0) mutex_m (0.3.0) nokogiri (1.19.4-aarch64-linux-gnu) racc (~> 1.4) @@ -398,13 +132,11 @@ GEM racc (~> 1.4) nokogiri (1.19.4-arm64-darwin) racc (~> 1.4) - nokogiri (1.19.4-x86_64-darwin) - racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-musl) racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -425,9 +157,6 @@ GEM racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) @@ -483,6 +212,14 @@ GEM rubocop-ast (1.50.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.23.0) + lint_roller (~> 1.1) + rubocop (~> 1.81) + rubocop-env (0.1.0) + rubocop + rubocop-factory_bot (2.28.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-gradual (0.4.0) benchmark diff-lcs (>= 1.2.0, < 2.0) @@ -490,13 +227,26 @@ GEM parallel (~> 1.10) rainbow (>= 2.2.2, < 4.0) rubocop (~> 1.0) - rubocop-lts (24.1.0) - rubocop-ruby3_2 (>= 3.0.0, < 4) - standard-rubocop-lts (>= 2.0.2, < 3) - version_gem (>= 1.1.2, < 3) + rubocop-lts (24.2.2) + rubocop-ruby3_2 (~> 3.0, >= 3.0.1) + standard-rubocop-lts (~> 2.0, >= 2.0.3) + version_gem (~> 1.1, >= 1.1.13) + rubocop-lts-rspec (1.0.5) + rubocop (~> 1.84, >= 1.84.2) + rubocop-env (~> 0.1, >= 0.1.0) + rubocop-factory_bot (~> 2.28, >= 2.28.0) + rubocop-rspec (~> 3.9, >= 3.9.0) + rubocop-rspec-extra (~> 0.3, >= 0.3.0) + standard (~> 1.54, >= 1.54.0) + standard-rspec (~> 0.5, >= 0.5.0) + version_gem (~> 1.1, >= 1.1.13) rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) + rubocop-minitest (0.40.0) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.38.0, < 2.0) rubocop-on-rbs (2.0.0) lint_roller (~> 1.1) rbs (~> 4.0) @@ -516,6 +266,13 @@ GEM lint_roller (~> 1.1) regexp_parser (>= 2.0) rubocop (~> 1.86, >= 1.86.2) + rubocop-rspec-extra (0.3.0) + lint_roller (~> 1.1) + rubocop (>= 1.72.1, < 2.0) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) rubocop-ruby3_2 (3.0.7) rubocop-gradual (~> 0.3, >= 0.3.6) rubocop-md (~> 2.0, >= 2.0.4) @@ -530,28 +287,22 @@ GEM ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) - service_actor (3.9.4) - zeitwerk (>= 1.0) silent_stream (1.0.12) logger (~> 1.2) version_gem (>= 1.1.8, < 3) - simplecov (0.22.0) - docile (~> 1.1) - simplecov-html (~> 0.11) - simplecov_json_formatter (~> 0.1) - simplecov-cobertura (3.2.0) + simplecov (1.0.2) + simplecov-cobertura (4.0.0) rexml - simplecov (~> 0.19) + simplecov (~> 1.0) simplecov-console (0.9.5) ansi simplecov terminal-table - simplecov-html (0.13.2) - simplecov-lcov (0.9.0) simplecov-rcov (0.3.7) simplecov (>= 0.4.1) - simplecov_json_formatter (0.1.4) - sorbet-runtime (0.6.13342) + simplecov_lcov_formatter (0.9.0) + simplecov (>= 0.18) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -564,6 +315,12 @@ GEM standard-performance (1.9.0) lint_roller (~> 1.1) rubocop-performance (~> 1.26.0) + standard-rspec (0.5.0) + lint_roller (>= 1.0) + rubocop-capybara (~> 2.23) + rubocop-factory_bot (~> 2.27) + rubocop-rspec (~> 3.9) + rubocop-rspec_rails (~> 2.31) standard-rubocop-lts (2.0.10) standard (~> 1.54, >= 1.54.0) standard-custom (~> 1.0, >= 1.0.2) @@ -581,14 +338,20 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) - toml-rb (4.2.0) - citrus (~> 3.0, > 3.0) - racc (~> 1.7) + version_gem (~> 1.1, >= 1.1.14) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-aarch64-linux) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-arm64-darwin) + sorbet-runtime (~> 0.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -598,6 +361,7 @@ GEM unicode-emoji (~> 4.1) unicode-emoji (4.2.0) version_gem (1.1.14) + webrick (1.9.2) yaml-converter (0.2.3) hexapdf (>= 1.8, < 2) kramdown (>= 2.4, < 3) @@ -624,120 +388,85 @@ GEM zlib (3.2.3) PLATFORMS + aarch64-linux aarch64-linux aarch64-linux-gnu + aarch64-linux-gnu + aarch64-linux-musl aarch64-linux-musl arm64-darwin - x86_64-darwin + arm64-darwin + x86_64-linux x86_64-linux-gnu x86_64-linux-musl DEPENDENCIES addressable (>= 2.8, < 3) appraisal2 (~> 3.0, >= 3.0.6) - ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! - ast-template! - bash-merge! + appraisal2-rubocop (~> 1.0, >= 1.0.0) benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) - citrus-toml-merge! - commonmarker-merge! + cgi (~> 0.5) debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.4) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.0) - go-merge! irb (~> 1.17) json-merge! kettle-dev (~> 2.0, >= 2.2.25) - kettle-drift (~> 1.0, >= 1.0.5) - kettle-jem! - kettle-soup-cover (~> 1.0, >= 1.1.3) + kettle-soup-cover (~> 3.0, >= 3.0.3) kettle-test (~> 2.0, >= 2.0.9) - kramdown (~> 2.5, >= 2.5.1) - kramdown-merge! + kramdown (~> 2.5, >= 2.5.2) kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) rbs (>= 3.0) - rbs-merge! rdoc (~> 6.11) - reek (~> 6.5) + reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) - rubocop-lts (~> 24.1.0) - rubocop-on-rbs (~> 2.0) + rubocop-gradual (~> 0.4, >= 0.4.0) + rubocop-lts (~> 24.2, >= 24.2.1) + rubocop-lts-rspec (~> 1.0, >= 1.0.5) + rubocop-minitest (~> 0.40, >= 0.40.0) + rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) - rubocop-rspec (~> 3.6) - rubocop-ruby3_2 (~> 3.0.0) - ruby-merge! + rubocop-ruby3_2 (~> 3.0, >= 3.0.6) ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! - standard (>= 1.50) + standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.3) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! - typescript-merge! - yaml-converter (~> 0.1) - yaml-merge! - yard (~> 0.9, >= 0.9.44) - yard-fence (~> 0.9, >= 0.9.1) + tree_sitter_language_pack (~> 1.13, >= 1.13.3) + webrick (~> 1.9) + yaml-converter (~> 0.2, >= 0.2.3) + yard (~> 0.9, >= 0.9.45) + yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) - yard-timekeeper (~> 0.1) - yard-yaml (~> 0.1, >= 0.1.2) - zip-merge! + yard-timekeeper (~> 0.2, >= 0.2.4) + yard-yaml (~> 0.2, >= 0.2.3) CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af ansi (1.6.0) sha256=ac9ea0c0ea8d32fb4e271348e609963ac78882f34b73836c2a02b3622e666658 appraisal2 (3.2.0) sha256=ccd0b767ac4060cd7af6d16747459b6990f49c39c7b4fb1f7d1146b1e97c492f + appraisal2-rubocop (1.0.0) sha256=b71410fbb014befda5340605a605b7f6f3f012739baf0acc5b4351b592c3258d ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 - ast-crispr (7.1.0) - ast-crispr-markdown-markly (7.1.0) - ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 - bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 - citrus-toml-merge (7.1.0) cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 - commonmarker (2.9.0-aarch64-linux) sha256=e2b4aadb9a2cfa4e206582641ce3a49465549ac1ed4c289fdd63b78d8f24579c - commonmarker (2.9.0-aarch64-linux-musl) sha256=1cf4d2821f2a7e64945f1ed7c4eeced586fdb27ea7fe7337788802cf8f57cfca - commonmarker (2.9.0-arm64-darwin) sha256=1748dbfa4f5813b0d2a14bb4bbfa65a4ec293aa1c825016d60029ee0e132b046 - commonmarker (2.9.0-x86_64-darwin) sha256=0a9914ccfd2f5d2a59c7bd0dda4fe90eb084cf513b477e499008e09ec9d6edd6 - commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 - commonmarker (2.9.0-x86_64-linux-musl) sha256=293921398b839f79ceaf55010e061357e34f053822c3b003cd0be6686176335e - commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 diffy (3.4.4) sha256=79384ab5ca82d0e115b2771f0961e27c164c456074bd2ec46b637ebf7b6e47e3 - docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e - dotenv-merge (7.1.0) dry-configurable (1.4.0) sha256=e35d1b5f3c081753ef361f564919db79000f32cfa6f20ee3a3ba5921b41b73ce dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc @@ -746,61 +475,47 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) sha256=07094e80140a049164142820bdd327c30fcd855bb00697a0a430600a2b5144a2 - kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (1.1.3) sha256=a373827da22a7131d093afd32945e5b7d7a10a01ebfdded8fd2cb8230d69c8ad - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa - kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 language_server-protocol (3.17.0.6) sha256=5ef2c0c138f8267e1bc631d3328347d354f96724b0af22f2c79516120443b7f0 lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 - markdown-merge (7.1.0) - markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511 - markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 - nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 - prism-merge (7.1.0) psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 - psych-merge (7.1.0) public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023 - rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847 rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 - rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb @@ -818,35 +533,37 @@ CHECKSUMS rspec_junit_formatter (0.6.0) sha256=40dde674e6ae4e6cc0ff560da25497677e34fefd2338cc467a8972f602b62b15 rubocop (1.88.2) sha256=8def251c90cd955feb4daa3edc0ab56893250c4ce90ef81e6c80c03f9a939bbf rubocop-ast (1.50.0) sha256=b9ca88300da0803ee222ad20cdb30494c0a784eed06fdc35d254b06d662788db + rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357 + rubocop-env (0.1.0) sha256=5ab9a259e71822bf514c8e900a9b68cc2f74ccc87d5493efcd03213f3068e718 + rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb rubocop-gradual (0.4.0) sha256=9c7e584e6fef6c2539266a193a4572c970c22f99046fd6b0305bdde6228f96ad - rubocop-lts (24.1.0) sha256=9dcad4db2da2fe2f1f77f98c917d70e7c43eded703da14cd201d4be52a9272aa + rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 + rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d rubocop-rspec (3.10.2) sha256=0b3e2ecc592cd10ecbf0095bb58d1e357905276e069643523cc19eb7495f65e2 + rubocop-rspec-extra (0.3.0) sha256=ee4b6484d0332a0d23c4a465eeb607e41888eb3d4ed479f850b9f5212514f787 + rubocop-rspec_rails (2.32.0) sha256=4a0d641c72f6ebb957534f539d9d0a62c47abd8ce0d0aeee1ef4701e892a9100 rubocop-ruby3_2 (3.0.7) sha256=f53dd6d286fb05186214fc6ec116783e7f837030918e8931c05de773e98f8466 rubocop-thread_safety (0.7.3) sha256=067cdd52fbf5deffc18995437e45b5194236eaff4f71de3375a1f6052e48f431 - ruby-merge (7.1.0) ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) - service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 - simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 - simplecov-cobertura (3.2.0) sha256=70d702658677fcb20e5aceb6915ccf8bc62ff2ccd38b62b3ad5c9db5c0888740 + simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 + simplecov-cobertura (4.0.0) sha256=e4fb3159b1ecea545b44f5452a8611305323e78ad23eae8aed35924d072e01ea simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 - simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 - simplecov-lcov (0.9.0) sha256=7a77a31e200a595ed4b0249493056efd0c920601f53d2ef135ca34ee796346cd simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc - simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + standard-rspec (0.5.0) sha256=64d396524a65af47f5331b423d8cdd313e0267401647bb7892489ca89dad2973 standard-rubocop-lts (2.0.10) sha256=89708a505b7d8b24d2ac399a7520fcb9e764abc2ecb4289b631b5fe0e3b76617 stone_checksums (1.0.6) sha256=c775f830513d6c6ab26e31d1a5fbecd4c4e39002663d4d9f8fa96e97990b5298 stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 @@ -855,20 +572,18 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) sha256=0a91d0f76a9036e84e44f95693b12f58d358c1df3ac8e3b5271f2056ecc6e4b9 - toml-merge (7.1.0) - toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-aarch64-linux) sha256=55ffc7c87868cb45658338363d9eba51b4a8b0259aa88e4de368d2bd1d52fea4 + tree_sitter_language_pack (1.13.3-arm64-darwin) sha256=bc2498db605f212a1dbd2465ed3f65190d7da786f6ed5d30fcf958121aeb4a5c + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 yaml-converter (0.2.3) sha256=d35e69e547610d9e347672cc277fcb7d71dff3c53a942e66f82b1c64022ada72 - yaml-merge (7.1.0) yard (0.9.45) sha256=52e211493f7cb8a3ebf7e104a25a1e73937a3103092545d34cb88fafebb3dc51 yard-fence (0.9.6) sha256=3d1dbf4e3df462ac78b8bd2e01cf740a2de20168387c929aca31a0bcee490659 yard-junk (0.1.0) sha256=e85fe2ec1afa47313decd333447b53458cb1ed49b510b70015fdc3041a94bcdd @@ -876,8 +591,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/json-merge/LICENSE.md b/gems/json-merge/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/json-merge/LICENSE.md +++ b/gems/json-merge/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/json-merge/README.md b/gems/json-merge/README.md index b2f5382b8..a4febf8ef 100644 --- a/gems/json-merge/README.md +++ b/gems/json-merge/README.md @@ -85,8 +85,8 @@ File.write("merged.json", result.to_json) | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -438,7 +438,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -464,6 +464,8 @@ If none of the available licenses suit your use case, please [contact us](mailto [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/json-merge [⛳️namespace-img]: https://img.shields.io/badge/namespace-Json::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white @@ -508,7 +510,7 @@ If none of the available licenses suit your use case, please [contact us](mailto [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/json-merge [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/json-merge -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/json-merge [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/json-merge/gemfiles/modular/cgi/r4/v0.5.gemfile b/gems/json-merge/gemfiles/modular/cgi/r4/v0.5.gemfile new file mode 100644 index 000000000..17ad97260 --- /dev/null +++ b/gems/json-merge/gemfiles/modular/cgi/r4/v0.5.gemfile @@ -0,0 +1 @@ +gem 'cgi', '~> 0.5' diff --git a/gems/json-merge/gemfiles/modular/cgi/vHEAD.gemfile b/gems/json-merge/gemfiles/modular/cgi/vHEAD.gemfile new file mode 100644 index 000000000..650fbf033 --- /dev/null +++ b/gems/json-merge/gemfiles/modular/cgi/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'cgi', '>= 0.5' diff --git a/gems/json-merge/gemfiles/modular/coverage.gemfile b/gems/json-merge/gemfiles/modular/coverage.gemfile index c0ab9c066..b93014b6b 100644 --- a/gems/json-merge/gemfiles/modular/coverage.gemfile +++ b/gems/json-merge/gemfiles/modular/coverage.gemfile @@ -2,12 +2,12 @@ # We run code coverage on the latest version of Ruby only. -# Set KETTLE_RB_DEV=true for local development with path-based dependencies. +# Set KETTLE_DEV_DEV=true for local development with path-based dependencies. # When false (default / CI), remote released gems are used. -if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? # Coverage (remote/released) platform :mri do - gem 'kettle-soup-cover', '~> 1.0', '>= 1.1.3', require: false + gem 'kettle-soup-cover', '~> 3.0', '>= 3.0.3', require: false end else eval_gemfile 'coverage_local.gemfile' diff --git a/gems/json-merge/gemfiles/modular/coverage_local.gemfile b/gems/json-merge/gemfiles/modular/coverage_local.gemfile index 0c0150f21..c851f5445 100644 --- a/gems/json-merge/gemfiles/modular/coverage_local.gemfile +++ b/gems/json-merge/gemfiles/modular/coverage_local.gemfile @@ -1,20 +1,20 @@ # frozen_string_literal: true # Local path overrides for development. -# Loaded by the associated non-local gemfile when KETTLE_RB_DEV != "false". +# Loaded by the associated non-local gemfile when KETTLE_DEV_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[kettle-dev kettle-test kettle-soup-cover kettle-drift] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) local_gems_to_eval = local_gems - %w[json-merge] - declared_gems -# export KETTLE_RB_DEV=/path/to/kettle-rb +# export KETTLE_DEV_DEV=/path/to/my platform :mri do eval_nomono_gems( gems: local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/json-merge/gemfiles/modular/documentation.gemfile b/gems/json-merge/gemfiles/modular/documentation.gemfile index dff5cc108..9d4535f12 100644 --- a/gems/json-merge/gemfiles/modular/documentation.gemfile +++ b/gems/json-merge/gemfiles/modular/documentation.gemfile @@ -7,17 +7,17 @@ # # Documentation -gem 'kramdown', '~> 2.5', '>= 2.5.1', require: false # Ruby >= 2.5 +gem 'kramdown', '~> 2.5', '>= 2.5.2', require: false # Ruby >= 2.5 gem 'kramdown-parser-gfm', '~> 1.1', require: false # Ruby >= 2.3 -gem 'yaml-converter', '~> 0.1', require: false # Ruby >= 3.2 -gem 'yard', '~> 0.9', '>= 0.9.44', require: false +gem 'yaml-converter', '~> 0.2', '>= 0.2.3', require: false # Ruby >= 3.2 +gem 'yard', '~> 0.9', '>= 0.9.45', require: false gem 'yard-junk', '~> 0.1', '>= 0.1.0', require: false # Ruby >= 3.1 gem 'yard-relative_markdown_links', '~> 0.6', require: false if ENV.fetch('GALTZO_FLOSS_DEV', 'false').casecmp('false').zero? - gem 'yard-fence', '~> 0.9', '>= 0.9.1', require: false # Ruby >= 3.2 - gem 'yard-timekeeper', '~> 0.1', require: false - gem 'yard-yaml', '~> 0.1', '>= 0.1.2', require: false + gem 'yard-fence', '~> 0.9', '>= 0.9.6', require: false # Ruby >= 3.2 + gem 'yard-timekeeper', '~> 0.2', '>= 0.2.4', require: false + gem 'yard-yaml', '~> 0.2', '>= 0.2.3', require: false else eval_gemfile 'documentation_local.gemfile' end diff --git a/gems/json-merge/gemfiles/modular/documentation_local.gemfile b/gems/json-merge/gemfiles/modular/documentation_local.gemfile index 4d4c2bd95..688c7e199 100644 --- a/gems/json-merge/gemfiles/modular/documentation_local.gemfile +++ b/gems/json-merge/gemfiles/modular/documentation_local.gemfile @@ -3,13 +3,15 @@ # Local path overrides for development. # Loaded by the associated non-local gemfile when GALTZO_FLOSS_DEV != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[yard-fence yard-timekeeper yard-yaml] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[json-merge] - declared_gems # export GALTZO_FLOSS_DEV=/path/to/galtzo-floss eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'GALTZO_FLOSS', path_env: 'GALTZO_FLOSS_DEV', vendored_gems_env: 'GALTZO_FLOSS_VENDORED_GEMS', diff --git a/gems/json-merge/gemfiles/modular/erb/r3/v5.0.gemfile b/gems/json-merge/gemfiles/modular/erb/r3/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/json-merge/gemfiles/modular/erb/r3/v5.0.gemfile +++ b/gems/json-merge/gemfiles/modular/erb/r3/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/json-merge/gemfiles/modular/erb/r4/v5.0.gemfile b/gems/json-merge/gemfiles/modular/erb/r4/v5.0.gemfile index 0e3bf1b97..ec7ff451f 100644 --- a/gems/json-merge/gemfiles/modular/erb/r4/v5.0.gemfile +++ b/gems/json-merge/gemfiles/modular/erb/r4/v5.0.gemfile @@ -1 +1 @@ -gem 'erb', '~> 6.0', '>= 6.0.4' # ruby >= 3.2.0 +gem 'erb', '~> 6.0', '>= 6.0.6' # ruby >= 3.2.0 diff --git a/gems/json-merge/gemfiles/modular/json/truffleruby_22_3.gemfile b/gems/json-merge/gemfiles/modular/json/truffleruby_22_3.gemfile new file mode 100644 index 000000000..9b2f8d96a --- /dev/null +++ b/gems/json-merge/gemfiles/modular/json/truffleruby_22_3.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('22.3') + # TruffleRuby 22.3 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.5.1' +end diff --git a/gems/json-merge/gemfiles/modular/json/truffleruby_23_0.gemfile b/gems/json-merge/gemfiles/modular/json/truffleruby_23_0.gemfile new file mode 100644 index 000000000..d787a5ef4 --- /dev/null +++ b/gems/json-merge/gemfiles/modular/json/truffleruby_23_0.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.0') + # TruffleRuby 23.0 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.1' +end diff --git a/gems/json-merge/gemfiles/modular/json/truffleruby_23_1.gemfile b/gems/json-merge/gemfiles/modular/json/truffleruby_23_1.gemfile new file mode 100644 index 000000000..d78486b0e --- /dev/null +++ b/gems/json-merge/gemfiles/modular/json/truffleruby_23_1.gemfile @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +if RUBY_ENGINE == 'truffleruby' && RUBY_ENGINE_VERSION.start_with?('23.1') + # TruffleRuby 23.1 ships the json default gem from its emulated MRI Ruby. + gem 'json', '= 2.6.3' +end diff --git a/gems/json-merge/gemfiles/modular/optional.gemfile b/gems/json-merge/gemfiles/modular/optional.gemfile index 5ed8dfe9a..9ea429538 100644 --- a/gems/json-merge/gemfiles/modular/optional.gemfile +++ b/gems/json-merge/gemfiles/modular/optional.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during json-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -10,7 +10,6 @@ # Required for curated binstubs generated by kettle-jem install gem 'rbs', '>= 3.0', require: false # ruby >= 3.1 -gem 'stone_checksums', '~> 1.0', '>= 1.0.3', require: false # ruby >= 2.2 # Required for kettle-pre-release # URL parsing with Unicode support (falls back to URI if not available) diff --git a/gems/json-merge/gemfiles/modular/runtime_heads.gemfile b/gems/json-merge/gemfiles/modular/runtime_heads.gemfile index a6e1ccb82..ebf17c529 100644 --- a/gems/json-merge/gemfiles/modular/runtime_heads.gemfile +++ b/gems/json-merge/gemfiles/modular/runtime_heads.gemfile @@ -1,6 +1,6 @@ # frozen_string_literal: true -# To retain during json-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze @@ -8,7 +8,4 @@ # Test against HEAD of runtime dependencies so we can proactively file bugs -# Ruby >= 2.2 -gem 'version_gem', github: 'ruby-oauth/version_gem', branch: 'main' - eval_gemfile('x_std_libs/vHEAD.gemfile') diff --git a/gems/json-merge/gemfiles/modular/style.gemfile b/gems/json-merge/gemfiles/modular/style.gemfile index 8e3fdd739..4dbcc02c0 100644 --- a/gems/json-merge/gemfiles/modular/style.gemfile +++ b/gems/json-merge/gemfiles/modular/style.gemfile @@ -1,27 +1,30 @@ # frozen_string_literal: true -# To retain during json-merge templating: +# To retain during kettle-jem templating: # kettle-jem:freeze # # ... your code # kettle-jem:unfreeze # -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. -gem 'reek', '~> 6.5' +gem 'reek', '~> 6.5', '>= 6.5.0' platform :mri do - gem 'rubocop-on-rbs', '~> 2.0' # ruby >= 3.2.0 + gem 'appraisal2-rubocop', '~> 1.0', '>= 1.0.0', require: false + gem 'rubocop-gradual', '~> 0.4', '>= 0.4.0' + gem 'rubocop-minitest', '~> 0.40', '>= 0.40.0' + gem 'rubocop-on-rbs', '~> 2.0', '>= 2.0.0' # ruby >= 3.2.0 # gem "rubocop", "~> 1.73", ">= 1.73.2" # constrained by standard gem 'rubocop-packaging', '~> 0.6', '>= 0.6.0' - gem 'standard', '>= 1.50' + gem 'standard', '~> 1.56', '>= 1.56.0' if ENV.fetch('RUBOCOP_LTS_LOCAL', 'false').casecmp('false').zero? - gem 'rubocop-lts', '~> 24.1.0' - # "rubocop-lts-rspec" can't add here until other gems are updated. - gem 'rubocop-rspec', '~> 3.6' - gem 'rubocop-ruby3_2', '~> 3.0.0' + declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) + gem 'rubocop-lts', '~> 24.2', '>= 24.2.1' unless declared_gems.include?('rubocop-lts') + gem 'rubocop-lts-rspec', '~> 1.0', '>= 1.0.5' unless declared_gems.include?('rubocop-lts-rspec') + gem 'rubocop-ruby3_2', '~> 3.0', '>= 3.0.6' unless declared_gems.include?('rubocop-ruby3_2') else eval_gemfile('style_local.gemfile') end diff --git a/gems/json-merge/gemfiles/modular/style_local.gemfile b/gems/json-merge/gemfiles/modular/style_local.gemfile index ce75bbe21..043eca0d7 100644 --- a/gems/json-merge/gemfiles/modular/style_local.gemfile +++ b/gems/json-merge/gemfiles/modular/style_local.gemfile @@ -1,19 +1,21 @@ # frozen_string_literal: true -# We run rubocop on the latest version of Ruby, -# but in support of the oldest supported version of Ruby +# Style tasks run on the latest Ruby; RuboCop-LTS selects the compatibility +# rules for the configured Ruby floor independently from task dependency floors. # Local path overrides for development. # Loaded by the associated non-local gemfile when RUBOCOP_LTS_LOCAL != "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' local_gems = %w[rubocop-lts rubocop-lts-rspec rubocop-ruby3_2 standard-rubocop-lts] +declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) +local_gems_to_eval = local_gems - %w[json-merge] - declared_gems # export VENDORED_GEMS=rubocop-lts,rubocop-lts-rspec,rubocop-ruby3_2,standard-rubocop-lts platform :mri do eval_nomono_gems( - gems: local_gems, + gems: local_gems_to_eval, prefix: 'RUBOCOP_LTS', path_env: 'RUBOCOP_LTS_LOCAL', vendored_gems_env: 'VENDORED_GEMS', diff --git a/gems/json-merge/gemfiles/modular/templating.gemfile b/gems/json-merge/gemfiles/modular/templating.gemfile index e3c24e6b7..a672de184 100644 --- a/gems/json-merge/gemfiles/modular/templating.gemfile +++ b/gems/json-merge/gemfiles/modular/templating.gemfile @@ -1,22 +1,24 @@ # frozen_string_literal: true structuredmerge_remote = ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false').zero? -kettle_remote = ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false').zero? +kettle_remote = ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false').zero? if structuredmerge_remote - # Merge recipes and parser dependencies for released installs. + # Parser dependencies for released installs. + gem 'tree_sitter_language_pack', '~> 1.13', '>= 1.13.3' + # Merge recipes for released installs. gem 'kettle-jem', '>= 7.0' end if kettle_remote # Template/plugin checks for released installs. - gem 'kettle-drift', '~> 1.0', '>= 1.0.5', require: false + gem 'kettle-drift', '~> 1.0', '>= 1.0.6', require: false end # Set STRUCTUREDMERGE_DEV=/path/to/structuredmerge/ruby/gems for local development with path-based dependencies. # When false (default / CI), released kettle-jem brings merge gems and parser dependencies. # Local path overrides bring the same dependencies from sibling gemspecs. # -# Set KETTLE_RB_DEV=/path/to/kettle-rb for local development with Kettle plugin gems. +# Set KETTLE_DEV_DEV=/path/to/my for local development with Kettle plugin gems. # When false (default / CI), released Kettle plugin gems are used. eval_gemfile 'templating_local.gemfile' unless structuredmerge_remote && kettle_remote diff --git a/gems/json-merge/gemfiles/modular/templating_local.gemfile b/gems/json-merge/gemfiles/modular/templating_local.gemfile index b9b83f3c0..c3cb51d29 100644 --- a/gems/json-merge/gemfiles/modular/templating_local.gemfile +++ b/gems/json-merge/gemfiles/modular/templating_local.gemfile @@ -1,10 +1,10 @@ # frozen_string_literal: true # Local path overrides for templating development. -# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_RB_DEV +# Loaded by the associated non-local gemfile when STRUCTUREDMERGE_DEV or KETTLE_DEV_DEV # is not "false". -require 'nomono/bundler' unless defined?(Nomono) +require 'nomono/bundler' structuredmerge_local_gems = %w[ tree_haver @@ -39,19 +39,14 @@ structuredmerge_local_gems = %w[ ast-crispr-ruby-prism ] -kettle_rb_local_gems = %w[ +kettle_dev_local_gems = %w[ kettle-dev kettle-test kettle-soup-cover kettle-drift ] declared_gems = instance_variable_get(:@dependencies).to_a.map(&:name) structuredmerge_local_gems_to_eval = structuredmerge_local_gems - %w[json-merge] - declared_gems -kettle_rb_local_gems_to_eval = kettle_rb_local_gems - %w[json-merge] - declared_gems +kettle_dev_local_gems_to_eval = kettle_dev_local_gems - %w[json-merge] - declared_gems -tslp_dev = ENV.fetch('TSLP_DEV', nil) - -# export VENDORED_GEMS= platform :mri do - gem 'tree_sitter_language_pack', path: tslp_dev unless tslp_dev.to_s.empty? - if ENV.fetch('STRUCTUREDMERGE_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( gems: structuredmerge_local_gems_to_eval, @@ -63,11 +58,11 @@ platform :mri do ) end - if ENV.fetch('KETTLE_RB_DEV', 'false').casecmp('false') != 0 + if ENV.fetch('KETTLE_DEV_DEV', 'false').casecmp('false') != 0 eval_nomono_gems( - gems: kettle_rb_local_gems_to_eval, - prefix: 'KETTLE_RB', - path_env: 'KETTLE_RB_DEV', + gems: kettle_dev_local_gems_to_eval, + prefix: 'KETTLE_DEV', + path_env: 'KETTLE_DEV_DEV', vendored_gems_env: 'VENDORED_GEMS', vendor_gem_dir_env: 'VENDOR_GEM_DIR', debug_env: 'KETTLE_DEV_DEBUG' diff --git a/gems/json-merge/gemfiles/modular/webrick/r4/v1.9.gemfile b/gems/json-merge/gemfiles/modular/webrick/r4/v1.9.gemfile new file mode 100644 index 000000000..b1329ba84 --- /dev/null +++ b/gems/json-merge/gemfiles/modular/webrick/r4/v1.9.gemfile @@ -0,0 +1 @@ +gem 'webrick', '~> 1.9' diff --git a/gems/json-merge/gemfiles/modular/webrick/vHEAD.gemfile b/gems/json-merge/gemfiles/modular/webrick/vHEAD.gemfile new file mode 100644 index 000000000..c7e6f81a1 --- /dev/null +++ b/gems/json-merge/gemfiles/modular/webrick/vHEAD.gemfile @@ -0,0 +1 @@ +gem 'webrick', '>= 1.9' diff --git a/gems/json-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile b/gems/json-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile index bd4e884df..e2f6501eb 100644 --- a/gems/json-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile +++ b/gems/json-merge/gemfiles/modular/x_std_libs/r4/libs.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../../erb/r4/v5.0.gemfile' eval_gemfile '../../mutex_m/r4/v0.3.gemfile' eval_gemfile '../../stringio/r4/v3.0.gemfile' eval_gemfile '../../benchmark/r4/v0.5.gemfile' +eval_gemfile '../../cgi/r4/v0.5.gemfile' +eval_gemfile '../../webrick/r4/v1.9.gemfile' diff --git a/gems/json-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile b/gems/json-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile index 91f383c11..ab75cccf1 100644 --- a/gems/json-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile +++ b/gems/json-merge/gemfiles/modular/x_std_libs/vHEAD.gemfile @@ -2,3 +2,5 @@ eval_gemfile '../erb/vHEAD.gemfile' eval_gemfile '../mutex_m/vHEAD.gemfile' eval_gemfile '../stringio/vHEAD.gemfile' eval_gemfile '../benchmark/vHEAD.gemfile' +eval_gemfile '../cgi/vHEAD.gemfile' +eval_gemfile '../webrick/vHEAD.gemfile' diff --git a/gems/json-merge/lib/json/merge/conflict_resolver.rb b/gems/json-merge/lib/json/merge/conflict_resolver.rb index 78034f90a..f99658468 100644 --- a/gems/json-merge/lib/json/merge/conflict_resolver.rb +++ b/gems/json-merge/lib/json/merge/conflict_resolver.rb @@ -9,6 +9,7 @@ module Merge # resolver = ConflictResolver.new(template_analysis, dest_analysis) # resolver.resolve(result) class ConflictResolver < Ast::Merge::ConflictResolverBase + include Ast::Merge::CommentLayoutEmissionSupport include Ast::Merge::StructuredEmitterProvenanceSupport class MissingSharedInlineRegionError < Json::Merge::Error; end @@ -104,7 +105,7 @@ def freeze_node?(node) # @param dest_nodes [Array] Destination nodes # @param template_analysis [FileAnalysis] Template analysis for line access # @param dest_analysis [FileAnalysis] Destination analysis for line access - def merge_node_lists_to_emitter(template_nodes, dest_nodes, template_analysis, dest_analysis) + def merge_node_lists_to_emitter(template_nodes, dest_nodes, template_analysis, dest_analysis, dest_owners: nil) # Build signature maps for matching template_by_sig = build_signature_map(template_nodes, template_analysis) dest_by_sig = build_signature_map(dest_nodes, dest_analysis) @@ -171,7 +172,8 @@ def merge_node_lists_to_emitter(template_nodes, dest_nodes, template_analysis, d template_node = template_info[:node] # Both have this node - merge them (recursively if containers) - merge_matched_nodes_to_emitter(template_node, dest_node, template_analysis, dest_analysis) + merge_matched_nodes_to_emitter(template_node, dest_node, template_analysis, dest_analysis, + dest_owners: dest_nodes) consumed_template_indices << template_info[:index] sig_cursor[dest_sig] = cursor + 1 @@ -195,7 +197,8 @@ def merge_node_lists_to_emitter(template_nodes, dest_nodes, template_analysis, d end # Merge matched nodes - merge_matched_nodes_to_emitter(template_node, dest_node, template_analysis, dest_analysis) + merge_matched_nodes_to_emitter(template_node, dest_node, template_analysis, dest_analysis, + dest_owners: dest_nodes) elsif @remove_template_missing_nodes emit_removed_destination_node_comments(dest_node, dest_analysis) else @@ -236,7 +239,11 @@ def trailing_group_node_matched?(node, _signature) # @param dest_node [NodeWrapper] Destination node # @param template_analysis [FileAnalysis] Template analysis # @param dest_analysis [FileAnalysis] Destination analysis - def merge_matched_nodes_to_emitter(template_node, dest_node, template_analysis, dest_analysis) + def merge_matched_nodes_to_emitter(template_node, dest_node, template_analysis, dest_analysis, dest_owners: nil) + if preference_for_pair(template_node, dest_node) == :template + emit_retained_gap_before_matched_template_node(dest_node, dest_analysis, owners: dest_owners) + end + if dest_node.container? && template_node.container? # Both are containers - recursively merge their children merge_container_to_emitter(template_node, dest_node, template_analysis, dest_analysis) @@ -298,7 +305,8 @@ def merge_matched_nodes_to_emitter(template_node, dest_node, template_analysis, template_value.mergeable_children, dest_value.mergeable_children, template_analysis, - dest_analysis + dest_analysis, + dest_owners: dest_value.mergeable_children ) emit_container_trailing_lines(trailing_source_node, trailing_source_analysis) @@ -355,6 +363,15 @@ def merge_matched_nodes_to_emitter(template_node, dest_node, template_analysis, end end + def emit_retained_gap_before_matched_template_node(dest_node, dest_analysis, owners: nil) + gap_lines = retained_owner_leading_gap_lines_for(dest_node, dest_analysis, owners: owners) + return if gap_lines.empty? + return if @emitter.blank_lines?(gap_lines) && @emitter.ends_with_blank_line? + + gap = retained_owner_leading_gap_for(dest_node, dest_analysis, owners: owners) + @emitter.emit_raw_lines(gap_lines, metadata: emitter_block_metadata(dest_analysis, gap.start_line)) + end + # Merge container nodes by emitting via emitter # @param template_node [NodeWrapper] Template container node # @param dest_node [NodeWrapper] Destination container node diff --git a/gems/json-merge/lib/json/merge/file_analysis.rb b/gems/json-merge/lib/json/merge/file_analysis.rb index 81cad85b6..0156c4083 100644 --- a/gems/json-merge/lib/json/merge/file_analysis.rb +++ b/gems/json-merge/lib/json/merge/file_analysis.rb @@ -200,13 +200,8 @@ def root_merge_node end def parse_json - # TreeHaver handles backend selection against the grammar Json::Merge - # has already registered during bootstrap. - parser = if @parser_path - TreeHaver.parser_for(:json, library_path: @parser_path) - else - TreeHaver.parser_for(:json) - end + Json::Merge.register_backend! + parser = TreeHaver.parser_for(:json, backend_type: :tree_sitter) @ast = parser.parse(@source) diff --git a/gems/json-merge/spec/fixtures_integration_spec.rb b/gems/json-merge/spec/fixtures_integration_spec.rb index f17bce414..768fb98e5 100644 --- a/gems/json-merge/spec/fixtures_integration_spec.rb +++ b/gems/json-merge/spec/fixtures_integration_spec.rb @@ -87,24 +87,23 @@ def json_ready(value) expect(string_result[:ok]).to be(true) end - it 'fails closed for JSONC analysis when no TreeHaver JSON backend is available' do + it 'self-registers the JSON backend for direct file analysis' do source = <<~JSON { - // devcontainer files commonly use JSONC comments. "name": "Ruby", "customizations": { "jetbrains": { "backend": "RubyMine" } - }, + } } JSON analysis = described_class::FileAnalysis.new(source) - expect(analysis).not_to be_valid - expect(analysis.root_object).to be_nil - expect(analysis.errors).not_to be_empty + expect(analysis).to be_valid + expect(analysis.root_object).not_to be_nil + expect(analysis.errors).to be_empty end it 'conforms to the structure fixtures' do diff --git a/gems/json-merge/spec/retained_blank_gap_spec.rb b/gems/json-merge/spec/retained_blank_gap_spec.rb new file mode 100644 index 000000000..bb0a6dbd7 --- /dev/null +++ b/gems/json-merge/spec/retained_blank_gap_spec.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +require 'spec_helper' +require 'json/merge' + +RSpec.describe Json::Merge::SmartMerger, :json_grammar do + it 'preserves destination blank gaps between retained matched pairs under template preference' do + template = <<~JSON + { + "alpha": "1", + "beta": "2" + } + JSON + destination = <<~JSON + { + "alpha": "9", + + "beta": "8" + } + JSON + expected = <<~JSON + { + "alpha": "1", + + "beta": "2" + } + JSON + + expect(described_class.new(template, destination, preference: :template).merge).to eq(expected) + end + + it 'preserves destination blank gaps between retained matched nested pairs under template preference' do + template = <<~JSON + { + "app": { + "alpha": "1", + "beta": "2" + } + } + JSON + destination = <<~JSON + { + "app": { + "alpha": "9", + + "beta": "8" + } + } + JSON + expected = <<~JSON + { + "app": { + "alpha": "1", + + "beta": "2" + } + } + JSON + + expect(described_class.new(template, destination, preference: :template).merge).to eq(expected) + end +end diff --git a/gems/json-merge/spec/spec_helper.rb b/gems/json-merge/spec/spec_helper.rb index b1c9d9c49..127a823f4 100644 --- a/gems/json-merge/spec/spec_helper.rb +++ b/gems/json-merge/spec/spec_helper.rb @@ -8,7 +8,12 @@ # The rescue LoadError handles that scenario. begin require 'kettle-soup-cover' - require 'simplecov' if Kettle::Soup::Cover::DO_COV # `.simplecov` is run here! + if Kettle::Soup::Cover::DO_COV + # Requiring simplecov loads the project-local `.simplecov`. + require 'simplecov' + require 'kettle/soup/cover/config' + SimpleCov.start + end rescue LoadError => e # check the error message and re-raise when unexpected raise e unless e.message.include?('kettle') diff --git a/gems/kettle-jem/.github/workflows/ci.yml b/gems/kettle-jem/.github/workflows/ci.yml index 2d12ab169..540e43d0e 100644 --- a/gems/kettle-jem/.github/workflows/ci.yml +++ b/gems/kettle-jem/.github/workflows/ci.yml @@ -37,10 +37,10 @@ jobs: steps: - name: Checkout kettle-jem - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Setup Ruby & RubyGems - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: "${{ matrix.ruby }}" rubygems: "${{ matrix.rubygems }}" diff --git a/gems/kettle-jem/.github/workflows/coverage.yml b/gems/kettle-jem/.github/workflows/coverage.yml index e974040b9..da8a4281a 100644 --- a/gems/kettle-jem/.github/workflows/coverage.yml +++ b/gems/kettle-jem/.github/workflows/coverage.yml @@ -54,12 +54,12 @@ jobs: steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: "${{ matrix.ruby }}" rubygems: "${{ matrix.rubygems }}" diff --git a/gems/kettle-jem/.github/workflows/current.yml b/gems/kettle-jem/.github/workflows/current.yml index ff24160f1..9e5ea8691 100644 --- a/gems/kettle-jem/.github/workflows/current.yml +++ b/gems/kettle-jem/.github/workflows/current.yml @@ -45,12 +45,12 @@ jobs: steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} diff --git a/gems/kettle-jem/.github/workflows/dep-heads.yml b/gems/kettle-jem/.github/workflows/dep-heads.yml index d632a147a..e562781bf 100644 --- a/gems/kettle-jem/.github/workflows/dep-heads.yml +++ b/gems/kettle-jem/.github/workflows/dep-heads.yml @@ -1,5 +1,4 @@ -# Targets the evergreen latest release of ruby, truffleruby, and jruby -# and tests against the HEAD of runtime dependencies +# Targets enabled evergreen Ruby engines and tests against the HEAD of runtime dependencies name: Runtime Deps @ HEAD permissions: @@ -43,39 +42,32 @@ jobs: - ruby: "ruby" appraisal: "dep-heads" exec_cmd: "kettle-test" + # Run directly from the generated appraisal Gemfile so setup-ruby + # does not bootstrap Appraisal.root.gemfile against dependency + # sources before this dep-heads appraisal is selected. + # This makes gemfiles/dep_heads.gemfile required checked-in output + # for repositories using this generated workflow. + bundle_gemfile: "gemfiles/dep_heads.gemfile" + direct_bundle: true rubygems: latest bundler: latest steps: - name: Checkout if: ${{ !env.ACT }} - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems if: ${{ !env.ACT }} - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} bundler: ${{ matrix.bundler }} bundler-cache: true - - name: "[Attempt 1] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}" - id: bundleAppraisalAttempt1 - if: ${{ !env.ACT }} - run: bundle exec appraisal ${{ matrix.appraisal }} install - # Continue to the next step on failure - continue-on-error: true - - # Effectively an automatic retry of the previous step. - - name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}" - id: bundleAppraisalAttempt2 - # If bundleAppraisalAttempt1 failed, try again here; Otherwise skip. - if: ${{ !env.ACT && steps.bundleAppraisalAttempt1.outcome == 'failure' }} - run: bundle exec appraisal ${{ matrix.appraisal }} install - - name: Restore RSpec status log if: "${{!env.ACT}}" uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 @@ -86,9 +78,9 @@ jobs: rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}- rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}- - - name: Tests for ${{ matrix.ruby }} via Appraisal and ${{ matrix.exec_cmd }} + - name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }} if: ${{ !env.ACT }} - run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }} + run: bundle exec ${{ matrix.exec_cmd }} truffleruby: if: "(github.event_name != 'push' || (!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]'))) && (github.event_name != 'pull_request' || startsWith(github.head_ref, 'engines/') || startsWith(github.head_ref, 'truffleruby/'))" @@ -104,6 +96,11 @@ jobs: - ruby: "truffleruby" appraisal: "dep-heads" exec_cmd: "kettle-test" + # Run directly from the generated appraisal Gemfile so setup-ruby + # does not bootstrap Appraisal.root.gemfile against dependency + # sources before this dep-heads appraisal is selected. + # This makes gemfiles/dep_heads.gemfile required checked-in output + # for repositories using this generated workflow. bundle_gemfile: "gemfiles/dep_heads.gemfile" direct_bundle: true rubygems: default @@ -112,13 +109,13 @@ jobs: steps: - name: Checkout if: ${{ !env.ACT }} - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems if: ${{ !env.ACT }} - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} @@ -145,7 +142,7 @@ jobs: runs-on: ubuntu-latest continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }} env: - BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile + BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.bundle_gemfile || 'Appraisal.root.gemfile' }} strategy: fail-fast: true matrix: @@ -153,6 +150,13 @@ jobs: - ruby: "jruby" appraisal: "dep-heads" exec_cmd: "kettle-test" + # Run directly from the generated appraisal Gemfile so setup-ruby + # does not bootstrap Appraisal.root.gemfile against dependency + # sources before this dep-heads appraisal is selected. + # This makes gemfiles/dep_heads.gemfile required checked-in output + # for repositories using this generated workflow. + bundle_gemfile: "gemfiles/dep_heads.gemfile" + direct_bundle: true rubygems: default bundler: default experimental: true @@ -160,30 +164,19 @@ jobs: steps: - name: Checkout if: ${{ !env.ACT }} - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems if: ${{ !env.ACT }} - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} bundler: ${{ matrix.bundler }} bundler-cache: true - - name: "[Attempt 1] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}" - id: bundleAppraisalAttempt1 - if: ${{ !env.ACT }} - run: bundle exec appraisal ${{ matrix.appraisal }} install - continue-on-error: true - - - name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}" - id: bundleAppraisalAttempt2 - if: ${{ !env.ACT && steps.bundleAppraisalAttempt1.outcome == 'failure' }} - run: bundle exec appraisal ${{ matrix.appraisal }} install - - name: Restore RSpec status log if: "${{!env.ACT}}" uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 @@ -194,6 +187,6 @@ jobs: rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}- rspec-status-dep-heads-${{matrix.ruby}}-${{matrix.appraisal}}- - - name: Tests for ${{ matrix.ruby }} via Appraisal and ${{ matrix.exec_cmd }} + - name: Tests for ${{ matrix.ruby }} via ${{ matrix.exec_cmd }} if: ${{ !env.ACT }} - run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }} + run: bundle exec ${{ matrix.exec_cmd }} diff --git a/gems/kettle-jem/.github/workflows/dependency-review.yml b/gems/kettle-jem/.github/workflows/dependency-review.yml index ee085b6ff..0316e06bd 100644 --- a/gems/kettle-jem/.github/workflows/dependency-review.yml +++ b/gems/kettle-jem/.github/workflows/dependency-review.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: 'Dependency Review' diff --git a/gems/kettle-jem/.github/workflows/heads.yml b/gems/kettle-jem/.github/workflows/heads.yml index 95b0f24a4..a7b208445 100644 --- a/gems/kettle-jem/.github/workflows/heads.yml +++ b/gems/kettle-jem/.github/workflows/heads.yml @@ -48,13 +48,13 @@ jobs: steps: - name: Checkout if: ${{ !env.ACT }} - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems if: ${{ !env.ACT }} - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} @@ -109,13 +109,13 @@ jobs: steps: - name: Checkout if: ${{ !env.ACT }} - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems if: ${{ !env.ACT }} - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} @@ -167,13 +167,13 @@ jobs: steps: - name: Checkout if: ${{ !env.ACT }} - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems if: ${{ !env.ACT }} - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} diff --git a/gems/kettle-jem/.github/workflows/jruby.yml b/gems/kettle-jem/.github/workflows/jruby.yml index c92a3d1d7..936909741 100644 --- a/gems/kettle-jem/.github/workflows/jruby.yml +++ b/gems/kettle-jem/.github/workflows/jruby.yml @@ -47,13 +47,13 @@ jobs: steps: - name: Checkout if: ${{ !env.ACT }} - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems if: ${{ !env.ACT }} - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} diff --git a/gems/kettle-jem/.github/workflows/locked_deps.yml b/gems/kettle-jem/.github/workflows/locked_deps.yml index 1740ee3d8..6ab882686 100644 --- a/gems/kettle-jem/.github/workflows/locked_deps.yml +++ b/gems/kettle-jem/.github/workflows/locked_deps.yml @@ -71,12 +71,12 @@ jobs: steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} diff --git a/gems/kettle-jem/.github/workflows/opencollective.yml b/gems/kettle-jem/.github/workflows/opencollective.yml index 8d1fd4753..5b5c3649f 100644 --- a/gems/kettle-jem/.github/workflows/opencollective.yml +++ b/gems/kettle-jem/.github/workflows/opencollective.yml @@ -16,11 +16,11 @@ jobs: README_UPDATER_TOKEN: ${{ secrets.README_UPDATER_TOKEN }} REPO: ${{ github.repository }} steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ruby rubygems: default diff --git a/gems/kettle-jem/.github/workflows/style.yml b/gems/kettle-jem/.github/workflows/style.yml index de17a7678..ec079a197 100644 --- a/gems/kettle-jem/.github/workflows/style.yml +++ b/gems/kettle-jem/.github/workflows/style.yml @@ -42,12 +42,12 @@ jobs: steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} diff --git a/gems/kettle-jem/.github/workflows/templating.yml b/gems/kettle-jem/.github/workflows/templating.yml index e8515054b..56f319ab3 100644 --- a/gems/kettle-jem/.github/workflows/templating.yml +++ b/gems/kettle-jem/.github/workflows/templating.yml @@ -46,12 +46,12 @@ jobs: steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} diff --git a/gems/kettle-jem/.github/workflows/truffle.yml b/gems/kettle-jem/.github/workflows/truffle.yml index b41ba5a5b..334651f3d 100644 --- a/gems/kettle-jem/.github/workflows/truffle.yml +++ b/gems/kettle-jem/.github/workflows/truffle.yml @@ -47,13 +47,13 @@ jobs: steps: - name: Checkout if: ${{ !env.ACT }} - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems if: ${{ !env.ACT }} - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} diff --git a/gems/kettle-jem/.github/workflows/unlocked_deps.yml b/gems/kettle-jem/.github/workflows/unlocked_deps.yml index 53346f247..5cb3b4b8c 100644 --- a/gems/kettle-jem/.github/workflows/unlocked_deps.yml +++ b/gems/kettle-jem/.github/workflows/unlocked_deps.yml @@ -62,12 +62,12 @@ jobs: steps: - name: Checkout - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - name: Setup Ruby & RubyGems - uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0 + uses: ruby/setup-ruby@a30dfa457ad68707b8b910ac3a244714b61c0626 # v1.320.0 with: ruby-version: ${{ matrix.ruby }} rubygems: ${{ matrix.rubygems }} diff --git a/gems/kettle-jem/.kettle-drift.lock b/gems/kettle-jem/.kettle-drift.lock index bc1265c3c..a39b59e0a 100644 --- a/gems/kettle-jem/.kettle-drift.lock +++ b/gems/kettle-jem/.kettle-drift.lock @@ -32,9 +32,9 @@ { "file": ".github/workflows/dep-heads.yml", "lines": [ - 44, - 105, - 154 + 43, + 97, + 151 ] } ], @@ -48,6 +48,16 @@ ] } ], + "exec_cmd: \"kettle-test\"\n# Run directly from the generated appraisal Gemfile so setup-ruby": [ + { + "file": ".github/workflows/dep-heads.yml", + "lines": [ + 44, + 98, + 152 + ] + } + ], "exec_cmd: \"kettle-test\"\nrubygems: default": [ { "file": ".github/workflows/heads.yml", diff --git a/gems/kettle-jem/.rubocop_gradual.lock b/gems/kettle-jem/.rubocop_gradual.lock index 0334d6fb6..2968adb54 100644 --- a/gems/kettle-jem/.rubocop_gradual.lock +++ b/gems/kettle-jem/.rubocop_gradual.lock @@ -1,5 +1,13 @@ { - "kettle-jem.gemspec:1742431759": [ + "benchmarks/fixtures/skeleton/Gemfile:3218324611": [ + [8, 1, 9, "Gemspec/DevelopmentDependencies: Specify development dependencies in gemspec.", 1499175571] + ], + "benchmarks/kettle_jem_ractor_planning.rb:4068228537": [ + [43, 1, 6, "Style/GlobalStdStream: Use `$stdout` instead of `STDOUT`.", 3356722952], + [466, 8, 66, "Style/RedundantFormat: Use `\"step duration share count\"` directly instead of `format`.", 4013676740], + [622, 6, 309, "Style/RedundantFormat: Use `\"variant +/- min median mean max recipes cmds pr pt fr ft safe f_units pr_job pt_job fr_job ft_job recipes changed\"` directly instead of `format`.", 3979716419] + ], + "kettle-jem.gemspec:2340002234": [ [19, 32, 10, "Gemspec/RequiredRubyVersion: `required_ruby_version` and `TargetRubyVersion` (3.2, which may be specified in .rubocop.yml) should be equal.", 3888670706], [90, 3, 70, "Gemspec/DependencyVersion: Dependency version specification is required.", 4023754366], [91, 3, 65, "Gemspec/DependencyVersion: Dependency version specification is required.", 1638532368], @@ -19,5 +27,65 @@ [109, 3, 54, "Gemspec/DependencyVersion: Dependency version specification is required.", 527713396], [111, 3, 54, "Gemspec/DependencyVersion: Dependency version specification is required.", 3116501450], [112, 3, 54, "Gemspec/DependencyVersion: Dependency version specification is required.", 2771890615] + ], + "lib/kettle/jem.rb:1835077538": [ + [3877, 9, 10, "ThreadSafety/NewThread: Avoid starting new threads.", 3411682361], + [4278, 9, 32, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 2221659486], + [10943, 9, 10, "ThreadSafety/NewThread: Avoid starting new threads.", 3411682361] + ], + "lib/kettle/jem/tasks/install_task.rb:2120658194": [ + [1099, 47, 29, "Style/SafeNavigation: Use safe navigation (`&.`) instead of checking if an object exists before calling the method.", 964126728] + ], + "spec/e2e/rubygems_thin_vertical_slice_spec.rb:3402585310": [ + [3, 1, 58, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*RubyGems_thin_vertical_slice*_spec.rb`.", 3968596449], + [3, 29, 30, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 3589370396] + ], + "spec/integration/appraisal_helper_and_token_spec.rb:3707928361": [ + [3, 1, 67, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*appraisal_helpers_and_template_tokens*_spec.rb`.", 1438226331], + [3, 29, 39, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 1357968070] + ], + "spec/integration/appraisals_and_gemfile_template_spec.rb:1317014732": [ + [3, 1, 63, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*Appraisals_and_Gemfile_templating*_spec.rb`.", 2367084249], + [3, 29, 35, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 1539510212] + ], + "spec/integration/config_metadata_template_spec.rb:3410327496": [ + [3, 1, 67, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*configuration_and_metadata_templating*_spec.rb`.", 3610099387], + [3, 29, 39, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 1907259302] + ], + "spec/integration/coverage_template_spec.rb:3265006228": [ + [3, 1, 66, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*coverage_bootstrap_template_behavior*_spec.rb`.", 823415992], + [3, 29, 38, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 151296325] + ], + "spec/integration/gemspec_template_spec.rb:3136728880": [ + [3, 1, 48, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*gemspec_templating*_spec.rb`.", 30263623], + [3, 29, 20, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 2014438586] + ], + "spec/integration/github_workflow_template_spec.rb:3021876464": [ + [3, 1, 56, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*GitHub_workflow_templating*_spec.rb`.", 446190427], + [3, 29, 28, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 855400678] + ], + "spec/integration/readme_changelog_template_spec.rb:3264156297": [ + [3, 1, 61, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*README_and_changelog_templating*_spec.rb`.", 997155358], + [3, 29, 33, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 3993812611] + ], + "spec/integration/recipe_planning_spec.rb:1254848899": [ + [3, 1, 71, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*recipe_planning_and_writeintent_behavior*_spec.rb`.", 2828860406], + [3, 29, 43, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 2383456363] + ], + "spec/integration/shim_profile_spec.rb:3401820158": [ + [3, 1, 53, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*shim_profile_templating*_spec.rb`.", 837334745], + [3, 29, 25, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 2022445956] + ], + "spec/integration/structural_merge_template_spec.rb:2021995953": [ + [3, 1, 64, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*structural_merge_template_behavior*_spec.rb`.", 1693815617], + [3, 29, 36, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 3903270460] + ], + "spec/integration/template_bootstrap_spec.rb:539081283": [ + [3, 1, 71, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*template_selection_and_bootstrap_behavior*_spec.rb`.", 2832878461], + [3, 29, 43, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 1664161888] + ], + "spec/system/install_orchestration_spec.rb:352463012": [ + [3, 1, 70, "RSpec/SpecFilePathFormat: Spec path should end with `kettle/jem*install_and_local_orchestration_behavior*_spec.rb`.", 1687390280], + [3, 29, 42, "RSpec/DescribeMethod: The second argument to describe should be the method being tested. '#instance' or '.class'.", 2090400053] ] } diff --git a/gems/kettle-jem/CHANGELOG.md b/gems/kettle-jem/CHANGELOG.md index d92efeab4..c23652df7 100644 --- a/gems/kettle-jem/CHANGELOG.md +++ b/gems/kettle-jem/CHANGELOG.md @@ -20,10 +20,43 @@ Please file a bug if you notice a violation of semantic versioning. ### Added +- Templating plan reports now include per-recipe duration metadata, template + planning deduplicates destination and template-source file reads, and runtime + loading is reduced to explicit main-Ractor extension points. A disabled + classified planning strategy now identifies worker-safe recipes, can opt into + experimental Ractor workers with `KETTLE_JEM_RACTOR_WORKERS`, records + execution counters, and preserves sequential report parity in preparation for + Ractor-based recipe planning. +- Added a `benchmarks/` harness that templates a reset Bundler gem skeleton and + compares classified planning and phase-gated file work with and without + opt-in Ractor workers. The harness now defaults `KJ_MIN_RUBY` to `1.8.7` so + benchmark runs exercise legacy workflow and gemfile generation through the + supported one-shot `template --accept-config` flow, prints progress while + long benchmark matrices run, records planning and file-worker execution + counters for both Ractors and threads, and records the latest benchmark + outcome in a committed results README. +- Apply now routes recipe report mutations through explicit write intents and + phase-gated per-file work units, preparing the file-processing path for + opt-in `KETTLE_JEM_RACTOR_FILE_WORKERS` execution without changing phase gates + or final filesystem outcomes. +- The former monolithic thin-slice spec has been split into behavior-named + integration, system, and end-to-end specs so the project test harness can + parallelize templating coverage more effectively. +- Generated README Support & Community rows now include a RubyForum help badge. +- Generated READMEs can now render template-managed corporate sponsor logos + from `readme.corporate_sponsors` config or family-provided sponsorship data. +- `kettle-jem` now supports `--events` for newline-delimited JSON progress + events, including named event type filters via comma-separated + `--events=TYPE,...` values, phase events, per-recipe template progress, + post-apply and command-step events, diagnostics, and summary events for family + orchestration consumers. - Generated CI workflow templates now cache `.rspec_status` with explicit per-workflow keys so `kettle-test` / `turbo_tests2` can reuse timing data across MRI, JRuby, TruffleRuby, coverage, heads, dep-heads, and framework matrix runs. +- Generated dep-heads workflows now document why every engine job runs directly + from `gemfiles/dep_heads.gemfile`, making that generated Appraisal file + required checked-in output for the workflow. - JRuby 9.2 workflow templates now use the legacy-engine bundle install path instead of `ruby/setup-ruby` bundler caching so old Bundler does not fail setup against gem servers without the full legacy index. @@ -31,6 +64,9 @@ Please file a bug if you notice a violation of semantic versioning. collection entries with template package entries so project-specific packaged files are not lost when the template rewrites the generated gemspec structure. +- Main Gemfile templating now removes repeated direct sibling execution blocks + left behind by older `nomono` bootstrap output when applying the simplified + `require "nomono/bundler"` loader. - Gemspec templating now restores additional legacy Prism policy behavior for destination-only metadata fields, Bundler `git ls-files` package declarations, and empty development-dependency section cleanup after runtime dependency @@ -38,8 +74,9 @@ Please file a bug if you notice a violation of semantic versioning. - Added the repo-local `bin/kettle-jem-workflow-pins` maintenance script to update the GitHub Actions SHA pin index used by generated workflow templates via `kettle-gha-sha-pins`. -- Generated local Gemfile templates now document why `nomono` is explicitly - activated before requiring `nomono/bundler`. +- Generated local Gemfile templates now use a simple `require "nomono/bundler"` + loader, with a provider-relative loader for `nomono` itself, instead of + emitting runtime lockfile parsing or explicit gem activation ceremony. - Added the repo-local `bin/kettle-jem-deps-floor` maintenance script to scan dependency-bearing kettle-jem templates and update their dependency floors. - `kettle-jem install` now generates a curated `bin/appraisal` binstub for the @@ -69,6 +106,33 @@ Please file a bug if you notice a violation of semantic versioning. ### Changed +- Templating now reuses static, shareable regexes and small lookup lists in the + recipe dispatch and template-policy paths instead of reallocating them during + each recipe execution. +- Opt-in recipe-planning Ractor mode now batches worker-safe recipes across a + bounded chunked worker pool instead of spawning one Ractor per recipe, and it + keeps parser/merge paths with known unshareable dependency state on the main + Ractor. +- Templating can now opt into thread-backed recipe planning and file work with + `KETTLE_JEM_THREAD_WORKERS` and `KETTLE_JEM_THREAD_FILE_WORKERS`, providing a + benchmarkable alternative to main-thread and Ractor execution. +- Templating now supports benchmark-oriented skip controls for external + post-template work: `--skip-drift-check`, `--skip-rubocop-gradual`, and + `--skip-binstubs`, with matching `KETTLE_JEM_SKIP_*` environment variables. +- Templating reports now persist phase duration metadata, install command steps + record elapsed duration, and benchmark summaries show recipe-phase time apart + from external command time. +- The benchmark harness now supports `KETTLE_JEM_BENCHMARK_MODE=raw-template` + to compare scoped raw `TemplateTask` runs separately from the default + install-orchestrated one-shot template flow. +- The benchmark harness now defaults worker counts to `1,min(4,n/2),min(8,n/2),n` + instead of only `min(2,n)`, giving higher-core machines a useful default + scaling matrix while keeping low-core hosts bounded. +- Benchmark summaries now show each variant's median percentage delta against + `baseline-main` immediately after the variant name. +- README recipe reports now include sub-step timing metadata, and benchmark + results summarize the baseline README timing breakdown. + - Generated gemspec templates now require `kettle-dev` >= 2.3.7. - kettle-jem now requires `kettle-rb` >= 0.1.4. - Refreshed generated GitHub Actions workflow pins for `ruby/setup-ruby` and @@ -152,12 +216,67 @@ Please file a bug if you notice a violation of semantic versioning. - kettle-jem-template-20260716-002 - Generated gemspec manifests now ship fewer repository-only files by default to reduce downstream distro packaging churn. +- kettle-jem-template-20260720-001 - Generated READMEs can now render + template-managed corporate sponsor logos from project or family config. +- kettle-jem-template-20260720-002 - Generated development Gemfiles now use the + released `tree_sitter_language_pack` gem 1.13.3 or newer by default. +- kettle-jem-template-20260720-003 - Generated StructuredMerge Git diff driver + config now uses the installed `smorg-rb` Ruby driver name. +- kettle-jem-template-20260720-004 - Generated multi-engine workflow files now + omit JRuby and TruffleRuby jobs when project config declares MRI-only engines. +- kettle-jem-template-20260720-005 - Generated README Support & Community rows + now include a RubyForum help badge. + ### Deprecated ### Removed ### Fixed +- Generated license summaries now link split license detail files to the + repository `blob/main` copy instead of packaging-relative files that are + intentionally excluded from gem manifests. +- Generated root Gemfiles no longer duplicate the + `tree_sitter_language_pack` declaration that belongs to the templating + modular Gemfile. +- Generated README source badges now use GitHub's canonical capitalization. +- Generated nomono local Gemfiles now use the normal `require "nomono/bundler"` + loader instead of a nomono-specific `require_relative` path. +- Install orchestration now bundles each distinct Bundler environment it will + execute under, and probes RuboCop Gradual tasks with the same environment used + for the eventual command. +- Bundler child commands now strip inherited command-line Git configuration, so + parent `safe.bareRepository=explicit` settings do not break Bundler Git source + caches during templating. +- Generated semantic diff Git driver configuration now consistently uses the + installed `smorg-rb` executable and Git diff driver name for Ruby diffs. +- Generated multi-engine workflow files, including `heads.yml` and + `dep-heads.yml`, now omit JRuby and TruffleRuby jobs when the project config + declares an MRI-only `engines` list. +- `kettle-jem`'s generated development Gemfiles now depend on released + `tree_sitter_language_pack` 1.13.2 or newer by default, while still + allowing templating runs to switch to a local source with + `VENDORED_GEMS=tree_sitter_language_pack` / `VENDOR_GEM_DIR`. +- Gemspec templating now deletes empty generated development-dependency comment + sections through Prism-backed CRISPR structural edits, preventing blank-line + churn before the closing `Gem::Specification` `end`. +- Fixed the `kettle-jem` package manifest so runtime template assets are + included even when the gemspec is loaded from the monorepo root. +- Generated local templating Gemfiles can now route + `tree_sitter_language_pack` through nomono's `VENDORED_GEMS` / + `VENDOR_GEM_DIR` support instead of using a one-off inferred local path. + +- Templating setup now respects explicit `STRUCTUREDMERGE_DEV=false` and + `KETTLE_DEV_DEV=false` values when reading the kettle-family local install + marker, preventing prepare-mode bundle updates from re-enabling stale local + Gemfile wiring. +- Generated root Gemfiles no longer add a separate `gem "nomono"` bootstrap + line when templating the `nomono` gem itself, avoiding duplicate dependency + declarations against the package gemspec. +- `kettle-jem prepare` no longer explicitly asks Bundler to update parser gems + before they exist in a member lockfile, allowing cold-start templating + bootstraps to introduce vendored parser path dependencies during + `bundle install`. - Workflow template pin maintenance now compares and updates complete pinned action strings in source files, so `bin/kettle-jem-workflow-pins --check` fails when template files drift from `github_actions_step_pins` even if the @@ -171,9 +290,10 @@ Please file a bug if you notice a violation of semantic versioning. `sig//**/*.rbs` content into the package-level signature and removes the nested files, including when the package-level signature is managed by a template entry. -- Generated dep-heads workflows now run current TruffleRuby directly from the +- Generated dep-heads workflows now run every engine job directly from the generated `gemfiles/dep_heads.gemfile`, avoiding `Appraisal.root.gemfile` - bootstrap failures with TruffleRuby's bundled RubyGems/Bundler and gem.coop. + bootstrap failures with RubyGems/Bundler and gem.coop before the dep-heads + appraisal is selected. - Packaged Rakefile templating now merges destination Rakefiles by default instead of replacing them wholesale, preserving project-specific rake tasks such as release or adapter test helpers. @@ -793,7 +913,7 @@ Please file a bug if you notice a violation of semantic versioning. `kettle-drift` binstubs when they already exist from local/plugin installs without requiring unreleased `kettle-drift` in every generated gemspec. - Added `kettle-drift` to generated templating Gemfiles, resolved remotely in - templating mode and via `KETTLE_RB_DEV` locally, separate from the + templating mode and via `KETTLE_DEV_DEV` locally, separate from the `STRUCTUREDMERGE_DEV` StructuredMerge local gem set. - Refreshed generated README metadata blocks after template README merging so version-derived gemspec metadata such as `source_code_uri` does not stay stale. diff --git a/gems/kettle-jem/Gemfile b/gems/kettle-jem/Gemfile index c7b6554af..494373787 100644 --- a/gems/kettle-jem/Gemfile +++ b/gems/kettle-jem/Gemfile @@ -53,25 +53,9 @@ if direct_sibling_gems.any? && ENV.fetch("K_JEM_TEMPLATING", "false").casecmp("true").zero?) direct_sibling_dev_was_set = ENV.key?("STRUCTUREDMERGE_DEV") direct_sibling_dev_original = ENV.fetch("STRUCTUREDMERGE_DEV", nil) + require "nomono/bundler" begin - nomono_activation_requirements = nomono_requirements - nomono_lockfile = File.expand_path("Gemfile.lock", __dir__) - if File.file?(nomono_lockfile) - nomono_locked_spec = Bundler::LockfileParser - .new(Bundler.read_file(nomono_lockfile)) - .specs - .find { |spec| spec.name == "nomono" } - nomono_locked = nomono_locked_spec && - Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version) - if nomono_locked - nomono_activation_requirements = ["= #{nomono_locked_spec.version}"] - end - end - Kernel.send(:gem, "nomono", *nomono_activation_requirements) - require "nomono/bundler" - if direct_sibling_templating && !direct_sibling_local - ENV["STRUCTUREDMERGE_DEV"] = File.expand_path("..", __dir__) - end + ENV["STRUCTUREDMERGE_DEV"] = File.expand_path("..", __dir__) if direct_sibling_templating && !direct_sibling_local eval_nomono_gems( gems: direct_sibling_gems, @@ -79,8 +63,6 @@ if direct_sibling_gems.any? && path_env: "STRUCTUREDMERGE_DEV", root: ["src", "my", "structuredmerge"] ) - rescue LoadError - warn "Install nomono to enable STRUCTUREDMERGE_DEV local sibling-gem dependencies." ensure if direct_sibling_templating && !direct_sibling_local if direct_sibling_dev_was_set @@ -98,7 +80,7 @@ eval_gemfile "gemfiles/modular/templating.gemfile" if ENV.fetch("K_JEM_TEMPLATIN # Debugging eval_gemfile "gemfiles/modular/debug.gemfile" -# Code Coverage (env-switched: KETTLE_RB_DEV=true for local paths) +# Code Coverage (env-switched: KETTLE_DEV_DEV=true for local paths) eval_gemfile "gemfiles/modular/coverage.gemfile" # Linting diff --git a/gems/kettle-jem/Gemfile.lock b/gems/kettle-jem/Gemfile.lock index bd7918522..4db943597 100644 --- a/gems/kettle-jem/Gemfile.lock +++ b/gems/kettle-jem/Gemfile.lock @@ -27,267 +27,43 @@ PATH tree_haver (= 7.1.0) yaml-merge (= 7.1.0) -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-markdown-markly +GEM + remote: https://gem.coop/ specs: + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + ansi (1.6.0) + appraisal2 (3.2.0) + bundler (>= 1.17.3) + rake (>= 10) + thor (>= 0.14) + appraisal2-rubocop (1.0.0) + appraisal2 (>= 3.1.4) + rubocop (>= 1.0) + version_gem (~> 1.1, >= 1.1.14) + ast (2.4.3) + ast-crispr (7.1.0) + ast-merge (= 7.1.0) + service_actor (~> 3.9) + version_gem (~> 1.1, >= 1.1.9) ast-crispr-markdown-markly (7.1.0) ast-crispr (= 7.1.0) markly-merge (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr-ruby-prism - specs: ast-crispr-ruby-prism (7.1.0) ast-crispr (= 7.1.0) prism-merge (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-crispr - specs: - ast-crispr (7.1.0) - ast-merge (= 7.1.0) - service_actor (~> 3.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge-git - specs: - ast-merge-git (7.1.0) - ast-merge (= 7.1.0) - json-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-merge - specs: ast-merge (7.1.0) benchmark token-resolver (~> 2.0, >= 2.0.4) tree_haver (= 7.1.0) version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ast-template - specs: - ast-template (7.1.0) - ast-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/bash-merge - specs: + backports (3.25.3) bash-merge (7.1.0) ast-merge (= 7.1.0) tree_haver (= 7.1.0) version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/binary-merge - specs: - binary-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/citrus-toml-merge - specs: - citrus-toml-merge (7.1.0) - toml-merge (= 7.1.0) - toml-rb (~> 4.1) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/commonmarker-merge - specs: - commonmarker-merge (7.1.0) - commonmarker (~> 2.2) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/dotenv-merge - specs: - dotenv-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/go-merge - specs: - go-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/json-merge - specs: - json-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/kramdown-merge - specs: - kramdown-merge (7.1.0) - kramdown (~> 2.5) - markdown-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markdown-merge - specs: - markdown-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/markly-merge - specs: - markly-merge (7.1.0) - markdown-merge (= 7.1.0) - markly (~> 0.9) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/parslet-toml-merge - specs: - parslet-toml-merge (7.1.0) - toml (~> 0.3) - toml-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/plain-merge - specs: - plain-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/prism-merge - specs: - prism-merge (7.1.0) - prism (~> 1.6) - ruby-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/psych-merge - specs: - psych-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - yaml-merge (= 7.1.0) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rbs-merge - specs: - rbs-merge (7.1.0) - ast-merge (= 7.1.0) - rbs (>= 3.10) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.14) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/ruby-merge - specs: - ruby-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/rust-merge - specs: - rust-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/smorg-rb - specs: - smorg-rb (7.1.0) - ast-merge (= 7.1.0) - ast-merge-git (= 7.1.0) - go-merge (= 7.1.0) - json-merge (= 7.1.0) - kettle-jem (= 7.1.0) - markly-merge (= 7.1.0) - plain-merge (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/toml-merge - specs: - toml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/tree_haver - specs: - tree_haver (7.1.0) - citrus (~> 3.0) - parslet (~> 2.0) - tree_sitter_language_pack (>= 1.9.0.pre.rc.40, < 2.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/typescript-merge - specs: - typescript-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/yaml-merge - specs: - yaml-merge (7.1.0) - ast-merge (= 7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /home/pboling/src/my/structuredmerge/ruby/gems/zip-merge - specs: - zip-merge (7.1.0) - tree_haver (= 7.1.0) - version_gem (~> 1.1, >= 1.1.9) - -PATH - remote: /var/home/pboling/src/my/structuredmerge/vendor/tree-sitter-language-pack/packages/ruby - specs: - tree_sitter_language_pack (1.12.5) - rb_sys (>= 0.9, < 0.9.128) - sorbet-runtime (~> 0.5) - -GEM - remote: https://gem.coop/ - specs: - addressable (2.9.0) - public_suffix (>= 2.0.2, < 8.0) - ansi (1.6.0) - appraisal2 (3.2.0) - bundler (>= 1.17.3) - rake (>= 10) - thor (>= 0.14) - appraisal2-rubocop (1.0.0) - appraisal2 (>= 3.1.4) - rubocop (>= 1.0) - version_gem (~> 1.1, >= 1.1.14) - ast (2.4.3) - backports (3.25.3) benchmark (0.5.0) bigdecimal (4.1.2) bundler-audit (0.9.3) @@ -295,9 +71,17 @@ GEM thor (~> 1.0) cgi (0.5.2) citrus (3.0.2) + citrus-toml-merge (7.1.0) + toml-merge (= 7.1.0) + toml-rb (~> 4.1) + version_gem (~> 1.1, >= 1.1.9) cmdparse (3.0.7) commonmarker (2.9.0-x86_64-linux) - concurrent-ruby (1.3.7) + commonmarker-merge (7.1.0) + commonmarker (~> 2.2) + markdown-merge (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) + concurrent-ruby (1.3.8) date (3.5.1) debug (1.11.1) irb (~> 1.10) @@ -305,6 +89,10 @@ GEM delegate (0.6.1) diff-lcs (1.6.2) diffy (3.4.4) + dotenv-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.14) dry-configurable (1.4.0) dry-core (~> 1.0) zeitwerk (~> 2.6) @@ -335,7 +123,7 @@ GEM dry-logic (~> 1.4) zeitwerk (~> 2.6) emoji_regex (15.0.0) - erb (6.0.5) + erb (6.0.6) gem_bench (2.0.5) bundler (>= 1.14) version_gem (~> 1.1, >= 1.1.4) @@ -354,21 +142,24 @@ GEM rdoc (>= 4.0.0) reline (>= 0.4.2) json (2.21.1) - kettle-dev (2.3.7) + json-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) + kettle-dev (2.3.9) emoji_regex (>= 15.0) kettle-rb (~> 0.1, >= 0.1.2) kettle-test (~> 2.0, >= 2.0.4) ruby-progressbar (~> 1.13) - kettle-drift (1.0.5) - version_gem (~> 1.1, >= 1.1.13) - kettle-rb (0.1.4) - kettle-soup-cover (3.0.1) + kettle-rb (0.1.5) + kettle-soup-cover (3.0.4) + kettle-wash (~> 0.1, >= 0.1.0) simplecov (>= 1.0) simplecov-cobertura (>= 4.0) simplecov-console (~> 0.9, >= 0.9.5) simplecov-rcov (~> 0.3, >= 0.3.7) simplecov_lcov_formatter (~> 0.9, >= 0.9.0) - kettle-test (2.0.11) + kettle-test (2.0.12) appraisal2 (~> 3.0, >= 3.0.6) backports (~> 3.0) rspec (~> 3.0) @@ -379,18 +170,32 @@ GEM silent_stream (~> 1.0, >= 1.0.12) timecop-rspec (~> 1.0, >= 1.0.3) turbo_tests2 (~> 3.1, >= 3.1.12) + kettle-wash (0.1.1) + version_gem (~> 1.1, >= 1.1.14) kramdown (2.5.2) rexml (>= 3.4.4) + kramdown-merge (7.1.0) + kramdown (~> 2.5) + markdown-merge (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) language_server-protocol (3.17.0.6) lint_roller (1.1.0) logger (1.7.0) + markdown-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) markly (0.16.0) + markly-merge (7.1.0) + markdown-merge (= 7.1.0) + markly (~> 0.9) + version_gem (~> 1.1, >= 1.1.9) mutex_m (0.3.0) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) - nomono (1.0.8) + nomono (1.1.0) openssl (4.0.2) ostruct (0.6.3) parallel (1.28.0) @@ -404,20 +209,31 @@ GEM prettyprint prettyprint (0.2.0) prism (1.9.0) + prism-merge (7.1.0) + prism (~> 1.6) + ruby-merge (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) psych (5.4.0) date stringio + psych-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) + yaml-merge (= 7.1.0) public_suffix (7.0.5) racc (1.8.1) rainbow (3.1.1) rake (13.4.2) - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) - rake-compiler-dock (= 1.12.0) rbs (4.0.3) logger prism (>= 1.6.0) tsort + rbs-merge (7.1.0) + ast-merge (= 7.1.0) + rbs (>= 3.10) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.14) rdoc (6.17.0) erb psych (>= 4.0.0) @@ -500,7 +316,7 @@ GEM rubocop-md (2.0.4) lint_roller (~> 1.1) rubocop (>= 1.72.1) - rubocop-minitest (0.39.1) + rubocop-minitest (0.40.0) lint_roller (~> 1.1) rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0) @@ -541,6 +357,10 @@ GEM lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) rubocop-ast (>= 1.44.0, < 2.0) + ruby-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) ruby-progressbar (1.13.0) ruby_engine (2.0.3) ruby_version (1.0.3) @@ -561,7 +381,7 @@ GEM simplecov (>= 0.4.1) simplecov_lcov_formatter (0.9.0) simplecov (>= 0.18) - sorbet-runtime (0.6.13342) + sorbet-runtime (0.6.13351) standard (1.56.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -597,14 +417,23 @@ GEM delegate (~> 0.1) rspec (~> 3.0) timecop (>= 0.7, < 1) - token-resolver (2.0.4) + token-resolver (2.0.5) parslet (~> 2.0) - version_gem (~> 1.1, >= 1.1.13) - toml (0.3.0) - parslet (>= 1.8.0, < 3.0.0) + version_gem (~> 1.1, >= 1.1.14) + toml-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) toml-rb (4.2.0) citrus (~> 3.0, > 3.0) racc (~> 1.7) + tree_haver (7.1.0) + citrus (~> 3.0) + parslet (~> 2.0) + tree_sitter_language_pack (>= 1.13.2, < 2.0) + version_gem (~> 1.1, >= 1.1.9) + tree_sitter_language_pack (1.13.3-x86_64-linux) + sorbet-runtime (~> 0.5) tsort (0.2.0) turbo_tests2 (3.2.0) parallel_tests (>= 3.3.0, < 6) @@ -620,6 +449,10 @@ GEM kramdown (>= 2.4, < 3) kramdown-parser-gfm (~> 1.1) version_gem (~> 1.1, >= 1.1.13) + yaml-merge (7.1.0) + ast-merge (= 7.1.0) + tree_haver (= 7.1.0) + version_gem (~> 1.1, >= 1.1.9) yard (0.9.45) yard-fence (0.9.6) rdoc (>= 6.11, < 8) @@ -646,76 +479,45 @@ PLATFORMS DEPENDENCIES appraisal2 (~> 3.2, >= 3.2.0) appraisal2-rubocop (~> 1.0, >= 1.0.0) - ast-crispr! - ast-crispr-markdown-markly! - ast-crispr-ruby-prism! - ast-merge! - ast-merge-git! - ast-template! - bash-merge! benchmark (~> 0.5, >= 0.5.0) - binary-merge! bundler-audit (~> 0.9.3) cgi (~> 0.5) - citrus-toml-merge! - commonmarker-merge! debug (>= 1.1) - dotenv-merge! - erb (~> 6.0, >= 6.0.5) + erb (~> 6.0, >= 6.0.6) gem_bench (~> 2.0, >= 2.0.5) gitmoji-regex (~> 2.0, >= 2.0.4) - go-merge! irb (~> 1.17) - json-merge! - kettle-drift (~> 1.0, >= 1.0.5) kettle-jem! - kettle-soup-cover (~> 3.0, >= 3.0.1) - kettle-test (~> 2.0, >= 2.0.11) + kettle-soup-cover (~> 3.0, >= 3.0.3) + kettle-test (~> 2.0, >= 2.0.12) kramdown (~> 2.5, >= 2.5.2) - kramdown-merge! kramdown-parser-gfm (~> 1.1) - markdown-merge! - markly-merge! mutex_m (~> 0.2) nomono (~> 1.0, >= 1.0.8) - parslet-toml-merge! - plain-merge! - prism-merge! - psych-merge! rake (~> 13.0) - rbs-merge! rdoc (~> 6.11) reek (~> 6.5, >= 6.5.0) require_bench (~> 1.0, >= 1.0.4) rubocop-gradual (~> 0.4, >= 0.4.0) rubocop-lts (~> 24.2, >= 24.2.1) rubocop-lts-rspec (~> 1.0, >= 1.0.5) - rubocop-minitest (~> 0.39, >= 0.39.1) + rubocop-minitest (~> 0.40, >= 0.40.0) rubocop-on-rbs (~> 2.0, >= 2.0.0) rubocop-packaging (~> 0.6, >= 0.6.0) rubocop-ruby3_2 (~> 3.0, >= 3.0.6) - ruby-merge! ruby-progressbar (~> 1.13) - rust-merge! - smorg-rb! standard (~> 1.56, >= 1.56.0) stone_checksums (~> 1.0, >= 1.0.6) stringio (>= 3.0) - toml-merge! - tree_haver! - tree_sitter_language_pack! turbo_tests2 (~> 3.2, >= 3.2.0) - typescript-merge! webrick (~> 1.9) yaml-converter (~> 0.2, >= 0.2.3) - yaml-merge! yard (~> 0.9, >= 0.9.45) yard-fence (~> 0.9, >= 0.9.6) yard-junk (~> 0.1, >= 0.1.0) yard-relative_markdown_links (~> 0.6) yard-timekeeper (~> 0.2, >= 0.2.4) yard-yaml (~> 0.2, >= 0.2.3) - zip-merge! CHECKSUMS addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af @@ -727,13 +529,11 @@ CHECKSUMS ast-crispr-markdown-markly (7.1.0) ast-crispr-ruby-prism (7.1.0) ast-merge (7.1.0) - ast-merge-git (7.1.0) - ast-template (7.1.0) backports (3.25.3) sha256=94298d32dc3c40ca15633b54e282780b49e2db0c045f602ea1907e4f63a17235 bash-merge (7.1.0) benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd - binary-merge (7.1.0) + bundler (4.0.17) sha256=214e21431b5665dd2f99df8a5511c6b151d7a72e8015c8b38f8b775b61cbb6c1 bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb citrus (3.0.2) sha256=4ec2412fc389ad186735f4baee1460f7900a8e130ffe3f216b30d4f9c684f650 @@ -741,7 +541,7 @@ CHECKSUMS cmdparse (3.0.7) sha256=f7c5cace10bec6abf853370ae095e4b97a84ed9d847b3fb38f41cc4fbc950739 commonmarker (2.9.0-x86_64-linux) sha256=8cfe92970eef585a19ddf6613224b91cab64d6029834661bda801f877c9c7f43 commonmarker-merge (7.1.0) - concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + concurrent-ruby (1.3.8) sha256=b2f1be836e968ccc78ccfce277ea79c72a88633f22306782c16ff23fb415d1e1 date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 delegate (0.6.1) sha256=54cf946cacfe05b1c23114edd8fbd8d54e9cea7abf36b95130ab53cc88b8f7e4 @@ -756,22 +556,21 @@ CHECKSUMS dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 emoji_regex (15.0.0) sha256=a508b2c0bee561169564e0aec96085020c900520d335e5533fd8e78e59493829 - erb (6.0.5) sha256=858e63488cb796c9daba8b6e9ff4b3879c395022049be9a66a8e00980e612eac + erb (6.0.6) sha256=a9b24986700f5bf127c4f297c5403c3ca41b83b0a316c0cd09a096b56e644ae5 gem_bench (2.0.5) sha256=0dc0fb44a5a5eb7b2f5c1c68a5b0164d72007132822c012bac3abe976b199ead geom2d (0.4.1) sha256=ea0998ea90c4f2752e24fe13d85a4f89bee689d151316140ebcc6369bf634ed9 gitmoji-regex (2.0.4) sha256=01410d3217940bd0e7b2299ec805245afe8d0f06a5d6d38f623d63a63c0ac34f - go-merge (7.1.0) hexapdf (1.9.1) sha256=2d1f6a3622e6bc2a70a707d4c3f3fa44f5552ecd9d899f6283abb07398a84884 io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 json (2.21.1) sha256=13a43df75d95641443f5702dff350f237164a9d811ff0f2c2800d4d980220583 json-merge (7.1.0) - kettle-dev (2.3.7) sha256=eb370113cd030d03cbe2d33b31c99858951017e5ad21a17e9ed89dc3770028ee - kettle-drift (1.0.5) + kettle-dev (2.3.9) sha256=03b2f72c6dda4d2c4401ee3c0c96853116c922766e7b5b04224434a49b571bfc kettle-jem (7.1.0) - kettle-rb (0.1.4) sha256=9cef7ce4f7021666b7222292f29051e51eaf042e8a5db11f3f4dd72f74243fc1 - kettle-soup-cover (3.0.1) sha256=83ebe2aa099f15781e4796b5faef0dc2720fba48f6b9d34808670b91baf271e4 - kettle-test (2.0.11) sha256=c710c90f7ab79d51f9452f0c09f5f90657e7a893f63583855c164d0b1b107ab2 + kettle-rb (0.1.5) sha256=0322a569860c86e70f90d5ebe72353b8720b7054c7efa9f9044857f5c972d29f + kettle-soup-cover (3.0.4) sha256=36d4df472362d2020d16411d7ce26ba2fe2a41fb8be64577ff9b5280acf99d86 + kettle-test (2.0.12) sha256=3a8e5c5f38db03a6f0a8896da6f3576d24e36f53796578c19aafaa2ba5a8ea52 + kettle-wash (0.1.1) sha256=ae2e08b64c72c46ceed5ffa197ed859e85352f38ed0412fca2e18ce29b2dc4f9 kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa kramdown-merge (7.1.0) kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 @@ -783,15 +582,13 @@ CHECKSUMS markly-merge (7.1.0) mutex_m (0.3.0) sha256=cfcb04ac16b69c4813777022fdceda24e9f798e48092a2b817eb4c0a782b0751 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a - nomono (1.0.8) sha256=bf4b9b426cbf216ab17b70db474f691b8ae1f1e29de8db4b0ecd405e6e7e1c80 + nomono (1.1.0) sha256=463dd4c79da02a855739a1b5483190d527b7868688be905e84abdb3449b32c88 openssl (4.0.2) sha256=1037ad2868ae58df9ad917891c0c0f9815a1172f6846d4bcdd508e4c2ee747c2 ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 parallel_tests (5.7.0) sha256=3f1762c46ca2c223b8af8ef877217f9d76974e191bfa934f2580b58bcf1d005c parser (3.3.12.0) sha256=21a6d7f755d5a24dfbdc6e6b772e4e879a52e7631a88bc5a3a134606052c9828 parslet (2.0.0) sha256=d45130695d39b43d7e6a91f4d2ec66b388a8d822bae38de9b4de9a5fbde1f606 - parslet-toml-merge (7.1.0) - plain-merge (7.1.0) pp (0.6.4) sha256=dfcb0fce700c41456265922884f9fe195d7fbb0674a3578e6c0f69588e82b570 prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 @@ -802,8 +599,6 @@ CHECKSUMS racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 - rake-compiler-dock (1.12.0) - rb_sys (0.9.127) rbs (4.0.3) sha256=5a7bf70e2628549d9a1f44eae447b2cfe55968a9c60cfff52693a4bdcc020e14 rbs-merge (7.1.0) rdoc (6.17.0) sha256=0f50d4e568fc98195f9bb155a9e8dff6c7feabfb515fb22ef6df1d12ad5a02b7 @@ -830,7 +625,7 @@ CHECKSUMS rubocop-lts (24.2.2) sha256=be6c745e1bb61daebd6af3cc3227c60f95be9f642a080773cad7df14c5f9f174 rubocop-lts-rspec (1.0.5) sha256=439552fd27440802cc499889e013bffa28aadc41adae5d4dfff3d984a2a809b4 rubocop-md (2.0.4) sha256=0d076b6b5e99dea2ddc928c4bd702497decb9a8400da7808091e02ebcafcfb93 - rubocop-minitest (0.39.1) sha256=998398d6da4026d297f0f9bf709a1eac5f2b6947c24431f94af08138510cf7ed + rubocop-minitest (0.40.0) sha256=353c698199115f12151144cf0b5a96f69bb9d77b660cf6536df2c4250c672a9d rubocop-on-rbs (2.0.0) sha256=ce74d1b3d5daead19f4b611623656c185821dfc9aed9c7079bb1e5d7d7c464be rubocop-packaging (0.6.0) sha256=fb92bd0fb48e6f8cdb1648d2249b0cd51c2497dcc87340132d22f01edbf558a7 rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 @@ -844,7 +639,6 @@ CHECKSUMS ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 ruby_engine (2.0.3) sha256=ca2ae7def8cfcdc2bfb6a186d36d5d59c8b403245dc0256c3802b767fa278aaa ruby_version (1.0.3) sha256=5930f9950746b7e6c973184398ee364ee7440b170fef7922b9f5cdf317f1ccb5 - rust-merge (7.1.0) service_actor (3.9.4) sha256=e63b523630b9a7e62959b2a90113b08d2565b5de9c148557b281ef847c9539ce silent_stream (1.0.12) sha256=377c43aa10033fe90c33b39ea8cd97d79f2d1c4856df598efc56f3091f3ae782 simplecov (1.0.2) sha256=c6459434efe4b948b46477cc2df2faa73ab365f83a33c7c17f81262f4f7f1244 @@ -852,8 +646,7 @@ CHECKSUMS simplecov-console (0.9.5) sha256=b1108bcfff5f210143e2b8301698c367b01586f20d25a73e95475a5df6fc6ff6 simplecov-rcov (0.3.7) sha256=372f50bf6df6b6350b7d0c840f2f8bdabe021861a43c26877b747c9ac96139fc simplecov_lcov_formatter (0.9.0) sha256=4c1839bb31dcf7a8f7a6474c94ed228aa03b994e9dd5e1965e58b4121b049bed - smorg-rb (7.1.0) - sorbet-runtime (0.6.13342) sha256=dbeb9892597f593ed2b29e38018912787f6c4e0c4b736d8af0d6bd3c63bde3c3 + sorbet-runtime (0.6.13351) sha256=f8fee17c6e3edf835dc6823d26afb9a7c8969c6710d1fabe2fb43f4e0c15c64f standard (1.56.0) sha256=ae2af4d9669589162ac69ed5ef59dcf9f346d4afc81f7e62b84339310dfcb787 standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 @@ -866,15 +659,13 @@ CHECKSUMS thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 timecop (0.9.11) sha256=41284dc6e5041f2184f781ace766f942108c842f8d8c1386a26e6343decc7542 timecop-rspec (1.0.3) sha256=005f14841bb606dcaefb060e321b5388e2e59537742bee8b3a9a9a40e598fab9 - token-resolver (2.0.4) sha256=33b926958f504525bba3ed511ab66fbcbf8ef30390815e931436b30f27ffcad0 - toml (0.3.0) + token-resolver (2.0.5) sha256=b852f924287ffb58a440856e862b056c8ad97e74b4b2526cee43e0771f40c25c toml-merge (7.1.0) toml-rb (4.2.0) sha256=10a48c91613e20cf63483a7a776767dfb3cd7d70e9327c0237443da601e13776 tree_haver (7.1.0) - tree_sitter_language_pack (1.12.5) + tree_sitter_language_pack (1.13.3-x86_64-linux) sha256=1ffd045bd236ea54f58c5872ee66121d01033359c1f28f375b7fd4a4b5620cf9 tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f turbo_tests2 (3.2.0) sha256=8b35421548399d1923567b177970f42671c65695b93cdd134d78fbcbab85dff0 - typescript-merge (7.1.0) unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f version_gem (1.1.14) sha256=6b7306c7e9416d06067561981ab3444e2cecb844f26cc325ae3c27b44cf85613 @@ -888,8 +679,7 @@ CHECKSUMS yard-timekeeper (0.2.4) sha256=62f8d001d737c6e2ac688e7b37386f958dceb0f6aff9c909575e1bec8d20775a yard-yaml (0.2.3) sha256=fe5fef18819e1cbd05bb8f1b9e1baad6bf70c28125eb75b57bbf6397b0831812 zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 - zip-merge (7.1.0) zlib (3.2.3) sha256=5bd316698b32f31a64ab910a8b6c282442ca1626a81bbd6a1674e8522e319c20 BUNDLED WITH - 4.0.16 + 4.0.17 diff --git a/gems/kettle-jem/LICENSE.md b/gems/kettle-jem/LICENSE.md index 6ad318705..65a770d1f 100644 --- a/gems/kettle-jem/LICENSE.md +++ b/gems/kettle-jem/LICENSE.md @@ -3,8 +3,8 @@ This project is made available under the following licenses. Choose the option that best fits your use case: -- [AGPL-3.0-only](AGPL-3.0-only.md) -- [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md) +- [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md) +- [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md) If none of the above licenses fit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. diff --git a/gems/kettle-jem/README.md b/gems/kettle-jem/README.md index 2eb923dfa..b241d1bf2 100644 --- a/gems/kettle-jem/README.md +++ b/gems/kettle-jem/README.md @@ -47,8 +47,8 @@ to build `kettle-jem` extension gems against the supported plugin seam. | Tokens to Remember | [![Gem name][⛳️name-img]][⛳️gem-name] [![Gem namespace][⛳️namespace-img]][⛳️gem-namespace] | |-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Works with MRI Ruby 4 | [![Ruby current Compat][💎ruby-c-i]][🚎11-c-wf]| -| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | -| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | +| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Get help from RubyForum][✉️ruby-forum-img]][✉️ruby-forum] [![Live Chat on Discord][✉️discord-invite-img-ftb]][✉️discord-invite] [![Get help from me on Upwork][👨🏼‍🏫expsup-upwork-img]][👨🏼‍🏫expsup-upwork] [![Get help from me on Codementor][👨🏼‍🏫expsup-codementor-img]][👨🏼‍🏫expsup-codementor] | +| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on GitHub.com][📜src-gh-img]][📜src-gh] [![The best SHA: dQw4w9WgXcQ!][🧮kloc-img]][🧮kloc] | | Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] | | Compliance | [![License: AGPL-3.0-only OR PolyForm-Small-Business-1.0.0][📄license-img]][📄license] [![Apache license compatibility: Category X][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] | | Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] | @@ -87,6 +87,8 @@ The _amazing_ test matrix is powered by the kettle-dev stack. This gem is part of the StructuredMerge Ruby package family. The implementation inventory, layering model, and backend notes live in the [root package-family guide][sm-family-guide]. Shared behavior is defined by the [StructuredMerge fixtures][sm-family-fixtures] and implemented by the [Go][sm-family-go], [Ruby][sm-family-ruby], [Rust][sm-family-rust], and [TypeScript][sm-family-typescript] repositories. +Merge analysis must enter parsing through `tree_haver`. Parser-specific gems register concrete TreeHaver backends; substrate gems register grammar mappings and keep shared format or language merge behavior in one place. Missing backends fail closed instead of falling back to direct parser-library calls. + [sm-family-guide]: https://github.com/structuredmerge/structuredmerge-ruby#package-family @@ -462,7 +464,7 @@ fill missing keys during config sync, and act as runtime overrides. | Variable | Description | |----------|-------------| -| `KETTLE_RB_DEV` | Workspace root for local sibling gems. `true` = `~/src/my`; a path = that path; unset/`false` = released gems. | +| `KETTLE_DEV_DEV` | Workspace root for local sibling gems. `true` = `~/src/my`; a path = that path; unset/`false` = released gems. | | `KETTLE_DEV_DEBUG` | Set to `true` for verbose debug output. | | `FUNDING_ORG` | OpenCollective organization handle for FUNDING.yml. Auto-derived from git remote if unset. | | `OPENCOLLECTIVE_HANDLE` | Alternative to `FUNDING_ORG` for personal OpenCollective pages. | @@ -578,7 +580,7 @@ See [CHANGELOG.md][📌changelog] for a list of releases. ## 📄 License -The gem is available under the following licenses: [AGPL-3.0-only](AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](PolyForm-Small-Business-1.0.0.md). +The gem is available under the following licenses: [AGPL-3.0-only](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/AGPL-3.0-only.md), [PolyForm-Small-Business-1.0.0](https://github.com/structuredmerge/structuredmerge-ruby/blob/main/PolyForm-Small-Business-1.0.0.md). See [LICENSE.md][📄license] for details. If none of the available licenses suit your use case, please [contact us](mailto:floss@galtzo.com) to discuss a custom commercial license. @@ -648,6 +650,8 @@ Thanks for RTFM. ☺️ [✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord [✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white [✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends +[✉️ruby-forum-img]: https://img.shields.io/badge/RubyForum-Help-CC342D?style=for-the-badge&logo=ruby&logoColor=white +[✉️ruby-forum]: https://www.rubyforum.org/c/help/8 [✇bundle-group-pattern]: https://gist.github.com/pboling/4564780 [⛳️gem-namespace]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem @@ -693,7 +697,7 @@ Thanks for RTFM. ☺️ [📜src-gl]: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/tree/main/gems/kettle-jem [📜src-cb-img]: https://img.shields.io/badge/CodeBerg-4893CC?style=for-the-badge&logo=CodeBerg&logoColor=blue [📜src-cb]: https://codeberg.org/structuredmerge/structuredmerge-ruby/src/branch/main/gems/kettle-jem -[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=Github&logoColor=green +[📜src-gh-img]: https://img.shields.io/badge/GitHub-238636?style=for-the-badge&logo=GitHub&logoColor=green [📜src-gh]: https://github.com/structuredmerge/structuredmerge-ruby/tree/main/gems/kettle-jem [📜docs-cr-rd-img]: https://img.shields.io/badge/RubyDoc-Current_Release-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white [📜docs-head-rd-img]: https://img.shields.io/badge/YARD_on_Galtzo.com-HEAD-943CD2?style=for-the-badge&logo=readthedocs&logoColor=white diff --git a/gems/kettle-jem/Rakefile b/gems/kettle-jem/Rakefile index c9b733eba..93608c46d 100644 --- a/gems/kettle-jem/Rakefile +++ b/gems/kettle-jem/Rakefile @@ -6,7 +6,7 @@ # kettle-jem will then preserve content between those markers across template runs. # kettle-jem:unfreeze -# kettle-jem Rakefile v7.1.0 - 2026-07-19 +# kettle-jem Rakefile v7.1.0 - 2026-07-22 # Ruby 2.3 (Safe Navigation) or higher required # # See LICENSE.md for license information. diff --git a/gems/kettle-jem/benchmarks/README.md b/gems/kettle-jem/benchmarks/README.md new file mode 100644 index 000000000..6fe2165cb --- /dev/null +++ b/gems/kettle-jem/benchmarks/README.md @@ -0,0 +1,200 @@ +# kettle-jem benchmarks + +This directory contains a repeatable benchmark harness for comparing +`kettle-jem` recipe planning and phase-gated file work with and without opt-in +Ractor workers. + +The fixture at `fixtures/skeleton/` is generated from a standard +`bundle gem skeleton --git` run, with the generated `.git/` directory removed +so the skeleton can be committed as project data. Benchmark runs never mutate +that fixture directly. Each measured run copies it into `tmp/benchmarks/work/`, +runs one-shot templating from that copied gem root, writes reports under +`tmp/benchmarks/reports/`, writes a machine-readable timing summary to +`tmp/benchmarks/summary.json`, updates `results/README.md`, and resets the +copied skeleton before and after the run. + +Run the benchmark from the `kettle-jem` project root. Because the development +bundle currently resolves `tree_sitter_language_pack` from the StructuredMerge +Git fork, install the bundle before the first benchmark run or whenever the +lockfile changes: + +```bash +cd /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem + +mise exec -C . -- env \ +GIT_CONFIG_COUNT=1 \ +GIT_CONFIG_KEY_0=safe.bareRepository \ +GIT_CONFIG_VALUE_0=all \ +K_JEM_TEMPLATING=true \ +STRUCTUREDMERGE_DEV=/home/pboling/src/my/structuredmerge/ruby/gems \ +VENDORED_GEMS= \ +VENDOR_GEM_DIR= \ +bundle install + +mise exec -C . -- env \ +K_JEM_TEMPLATING=true \ +STRUCTUREDMERGE_DEV=/home/pboling/src/my/structuredmerge/ruby/gems \ +VENDORED_GEMS= \ +VENDOR_GEM_DIR= \ +bundle exec ruby benchmarks/kettle_jem_ractor_planning.rb +``` + +## Examples + +Default install-orchestrated benchmark: + +```console +cd /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem + +mise exec -C . -- env \ +GIT_CONFIG_COUNT=1 \ +GIT_CONFIG_KEY_0=safe.bareRepository \ +GIT_CONFIG_VALUE_0=all \ +K_JEM_TEMPLATING=true \ +STRUCTUREDMERGE_DEV=/home/pboling/src/my/structuredmerge/ruby/gems \ +VENDORED_GEMS= \ +VENDOR_GEM_DIR= \ +bundle install + +mise exec -C . -- env \ +K_JEM_TEMPLATING=true \ +STRUCTUREDMERGE_DEV=/home/pboling/src/my/structuredmerge/ruby/gems \ +VENDORED_GEMS= \ +VENDOR_GEM_DIR= \ +KETTLE_JEM_BENCHMARK_RUNS=3 \ +bundle exec ruby benchmarks/kettle_jem_ractor_planning.rb +``` + +Raw template-only benchmark: + +```console +cd /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem + +mise exec -C . -- env \ +GIT_CONFIG_COUNT=1 \ +GIT_CONFIG_KEY_0=safe.bareRepository \ +GIT_CONFIG_VALUE_0=all \ +K_JEM_TEMPLATING=true \ +STRUCTUREDMERGE_DEV=/home/pboling/src/my/structuredmerge/ruby/gems \ +VENDORED_GEMS= \ +VENDOR_GEM_DIR= \ +bundle install + +mise exec -C . -- env \ +K_JEM_TEMPLATING=true \ +STRUCTUREDMERGE_DEV=/home/pboling/src/my/structuredmerge/ruby/gems \ +VENDORED_GEMS= \ +VENDOR_GEM_DIR= \ +KETTLE_JEM_BENCHMARK_MODE=raw-template \ +KETTLE_JEM_BENCHMARK_RUNS=3 \ +bundle exec ruby benchmarks/kettle_jem_ractor_planning.rb +``` + +`raw-template` pre-bootstraps `.structuredmerge/kettle-jem.yml` outside the measured interval, then benchmarks scoped template `--only "**/*"` so it routes through `TemplateTask` instead of the default install-orchestrated flow. + +Combined-worker-only benchmark: + +```console +cd /home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem + +mise exec -C . -- env \ +GIT_CONFIG_COUNT=1 \ +GIT_CONFIG_KEY_0=safe.bareRepository \ +GIT_CONFIG_VALUE_0=all \ +K_JEM_TEMPLATING=true \ +STRUCTUREDMERGE_DEV=/home/pboling/src/my/structuredmerge/ruby/gems \ +VENDORED_GEMS= \ +VENDOR_GEM_DIR= \ +bundle install + +mise exec -C . -- env \ +K_JEM_TEMPLATING=true \ +STRUCTUREDMERGE_DEV=/home/pboling/src/my/structuredmerge/ruby/gems \ +VENDORED_GEMS= \ +VENDOR_GEM_DIR= \ +KETTLE_JEM_BENCHMARK_RUNS=3 \ +bundle exec ruby benchmarks/kettle_jem_ractor_planning.rb --only combined +``` + +`--only combined` retains `baseline-main` for delta calculations and skips the planning-only and file-only split variants. Multiple selectors can be comma-separated or repeated. + +## ENV Variables + +Useful environment variables: + +| Variable | Default | Purpose | +| --- | --- | --- | +| `KETTLE_JEM_BENCHMARK_RUNS` | `3` | Number of measured runs for each variant. | +| `KETTLE_JEM_BENCHMARK_WORKERS` | `1,min(4,n/2),min(8,n/2),n` | Comma-separated worker counts for Ractor and thread variants, where `n` is `Etc.nprocessors`. | +| `KETTLE_JEM_BENCHMARK_COMMAND` | `template` | Public `kettle-jem` command to benchmark: `plan`, `apply`, `template`, or `install`. | +| `KETTLE_JEM_BENCHMARK_MODE` | `install-template` | Template benchmark mode: `install-template` keeps the one-shot install orchestration path; `raw-template` scopes `template` to all targets with `--only "**/*"` so it routes through `TemplateTask`. | +| `KETTLE_JEM_BENCHMARK_ONLY` | unset | Optional comma-separated variant selectors: `baseline`, `planning`, `file`, `combined`, `ractor`, or `thread`. CLI `--only` uses the same tokens and combines with this env var. | +| `KETTLE_JEM_BENCHMARK_MIN_RUBY` | `1.8.7` | Minimum Ruby value passed through `KJ_MIN_RUBY` to broaden generated workflow/gemfile coverage. | + +Benchmark runs set `KETTLE_JEM_SKIP_DRIFT_CHECK=true`, +`KETTLE_JEM_SKIP_RUBOCOP_GRADUAL=true`, `KETTLE_JEM_SKIP_BINSTUBS=true`, and +`KETTLE_JEM_SKIP_LOCK_NORMALIZATION=true` so external drift/style/setup cleanup +does not pad the template timing comparison. + +The harness invokes `exe/kettle-jem` through the kettle-jem development bundle +with `BUNDLE_GEMFILE` pinned to this checkout's `Gemfile`, so local sibling +StructuredMerge APIs are used while destination setup commands still sanitize +Bundler activation and select the copied fixture's own Gemfile. The development +bundle resolves `tree_sitter_language_pack` from +released `tree_sitter_language_pack` gem with the Ruby ABI platform-gem fix. +Run `bundle install` with the same `K_JEM_TEMPLATING`, `STRUCTUREDMERGE_DEV`, +`VENDORED_GEMS`, and `VENDOR_GEM_DIR` values shown above before invoking the +benchmark; otherwise Bundler can fail with "The git source ... is not yet +checked out." The `GIT_CONFIG_*` variables allow Bundler's bare Git cache on +systems configured with `safe.bareRepository=explicit`. + +The default `template` benchmark compares: + +- baseline classified planning with no Ractor workers +- planning-only Ractor workers via `KETTLE_JEM_RACTOR_WORKERS` +- planning-only thread workers via `KETTLE_JEM_THREAD_WORKERS` +- file-only Ractor workers via `KETTLE_JEM_RACTOR_FILE_WORKERS` +- file-only thread workers via `KETTLE_JEM_THREAD_FILE_WORKERS` +- combined planning and file Ractor workers +- combined planning and file thread workers + +Use `--only combined` or `KETTLE_JEM_BENCHMARK_ONLY=combined` when only the combined planning+file worker runs are useful. Baseline remains selected automatically so the summary can still show percentage deltas. + +Benchmark summaries include planning execution counters from each report: +worker-safe recipe count, Ractor/thread spawn count, and recipe count actually +executed by planning Ractors or threads. They also include file-work counters: +file work units, file-worker Ractor/thread spawns, and file work units committed +in Ractors or threads. These counters distinguish "workers were enabled" from +"work actually ran concurrently". + +Reports also persist phase durations and install command-step durations. The +benchmark table surfaces recipe-phase and external-command time separately so +template execution changes are not hidden by setup commands. Summary tables also +show each variant's median wall-clock percentage delta against `baseline-main` +as the second column. When README sub-step timings are present, the generated +results README also includes a baseline README timing breakdown so repeated +Markdown/AST work can be targeted directly. + +Long runs print timestamped progress lines before and after each measured +variant run, including elapsed seconds, recipe/change counts, planning Ractor +and thread recipe counts, and file Ractor/thread unit counts for completed runs. + +For `plan`, file-worker variants are skipped because no filesystem apply phase +runs. The default `template --accept-config` run exercises kettle-jem's +supported one-shot install flow: environment variables seed +`.structuredmerge/kettle-jem.yml`, the config bootstrap is written, and the +install/template task continues through the follow-up apply against that config. +Set `KETTLE_JEM_BENCHMARK_MODE=raw-template` to benchmark scoped +`template --only "**/*"` runs through `TemplateTask`, which isolates raw template +apply work from install orchestration. Raw-template mode first writes +`.structuredmerge/kettle-jem.yml` outside the measured interval so the timed run +uses the same accepted configuration shape without measuring install +orchestration. + +The latest committed benchmark summary lives at `results/README.md`. If the +full benchmark has already run and `tmp/benchmarks/summary.json` still exists, +regenerate only that committed summary without rerunning templating: + +```bash +mise exec -C /path/to/kettle-jem -- ruby benchmarks/kettle_jem_ractor_planning.rb --summarize-only +``` diff --git a/gems/kettle-jem/benchmarks/fixtures/skeleton/.gitignore b/gems/kettle-jem/benchmarks/fixtures/skeleton/.gitignore new file mode 100644 index 000000000..9106b2a34 --- /dev/null +++ b/gems/kettle-jem/benchmarks/fixtures/skeleton/.gitignore @@ -0,0 +1,8 @@ +/.bundle/ +/.yardoc +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ diff --git a/gems/kettle-jem/benchmarks/fixtures/skeleton/Gemfile b/gems/kettle-jem/benchmarks/fixtures/skeleton/Gemfile new file mode 100644 index 000000000..dd67942d4 --- /dev/null +++ b/gems/kettle-jem/benchmarks/fixtures/skeleton/Gemfile @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +# Specify your gem's dependencies in skeleton.gemspec +gemspec + +gem "irb" +gem "rake", "~> 13.0" diff --git a/gems/kettle-jem/benchmarks/fixtures/skeleton/README.md b/gems/kettle-jem/benchmarks/fixtures/skeleton/README.md new file mode 100644 index 000000000..ac3a148ad --- /dev/null +++ b/gems/kettle-jem/benchmarks/fixtures/skeleton/README.md @@ -0,0 +1,35 @@ +# Skeleton + +TODO: Delete this and the text below, and describe your gem + +Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/skeleton`. To experiment with that code, run `bin/console` for an interactive prompt. + +## Installation + +TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org. + +Install the gem and add to the application's Gemfile by executing: + +```bash +bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG +``` + +If bundler is not being used to manage dependencies, install the gem by executing: + +```bash +gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG +``` + +## Usage + +TODO: Write usage instructions here + +## Development + +After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment. + +To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org). + +## Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/skeleton. diff --git a/gems/kettle-jem/benchmarks/fixtures/skeleton/Rakefile b/gems/kettle-jem/benchmarks/fixtures/skeleton/Rakefile new file mode 100644 index 000000000..cd510a029 --- /dev/null +++ b/gems/kettle-jem/benchmarks/fixtures/skeleton/Rakefile @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +require "bundler/gem_tasks" +task default: %i[] diff --git a/gems/kettle-jem/benchmarks/fixtures/skeleton/bin/console b/gems/kettle-jem/benchmarks/fixtures/skeleton/bin/console new file mode 100755 index 000000000..db1f39cec --- /dev/null +++ b/gems/kettle-jem/benchmarks/fixtures/skeleton/bin/console @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "bundler/setup" +require "skeleton" + +# You can add fixtures and/or initialization code here to make experimenting +# with your gem easier. You can also use a different console, if you like. + +require "irb" +IRB.start(__FILE__) diff --git a/gems/kettle-jem/benchmarks/fixtures/skeleton/bin/setup b/gems/kettle-jem/benchmarks/fixtures/skeleton/bin/setup new file mode 100755 index 000000000..dce67d860 --- /dev/null +++ b/gems/kettle-jem/benchmarks/fixtures/skeleton/bin/setup @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -euo pipefail +IFS=$'\n\t' +set -vx + +bundle install + +# Do any other automated setup that you need to do here diff --git a/gems/kettle-jem/benchmarks/fixtures/skeleton/lib/skeleton.rb b/gems/kettle-jem/benchmarks/fixtures/skeleton/lib/skeleton.rb new file mode 100644 index 000000000..c8a8e6842 --- /dev/null +++ b/gems/kettle-jem/benchmarks/fixtures/skeleton/lib/skeleton.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require_relative "skeleton/version" + +module Skeleton + class Error < StandardError; end + # Your code goes here... +end diff --git a/gems/kettle-jem/benchmarks/fixtures/skeleton/lib/skeleton/version.rb b/gems/kettle-jem/benchmarks/fixtures/skeleton/lib/skeleton/version.rb new file mode 100644 index 000000000..7f8c5cf27 --- /dev/null +++ b/gems/kettle-jem/benchmarks/fixtures/skeleton/lib/skeleton/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module Skeleton + VERSION = "0.1.0" +end diff --git a/gems/kettle-jem/benchmarks/fixtures/skeleton/sig/skeleton.rbs b/gems/kettle-jem/benchmarks/fixtures/skeleton/sig/skeleton.rbs new file mode 100644 index 000000000..3e1127be8 --- /dev/null +++ b/gems/kettle-jem/benchmarks/fixtures/skeleton/sig/skeleton.rbs @@ -0,0 +1,4 @@ +module Skeleton + VERSION: String + # See the writing guide of rbs: https://github.com/ruby/rbs#guides +end diff --git a/gems/kettle-jem/benchmarks/fixtures/skeleton/skeleton.gemspec b/gems/kettle-jem/benchmarks/fixtures/skeleton/skeleton.gemspec new file mode 100644 index 000000000..c1fd0d516 --- /dev/null +++ b/gems/kettle-jem/benchmarks/fixtures/skeleton/skeleton.gemspec @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require_relative "lib/skeleton/version" + +Gem::Specification.new do |spec| + spec.name = "skeleton" + spec.version = Skeleton::VERSION + spec.authors = ["Peter H. Boling"] + spec.email = ["peter.boling@gmail.com"] + + spec.summary = "TODO: Write a short summary, because RubyGems requires one." + spec.description = "TODO: Write a longer description or delete this line." + spec.homepage = "TODO: Put your gem's website or public repo URL here." + spec.required_ruby_version = ">= 3.2.0" + spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'" + spec.metadata["homepage_uri"] = spec.homepage + spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here." + + # Uncomment the line below to require MFA for gem pushes. + # This helps protect your gem from supply chain attacks by ensuring + # no one can publish a new version without multi-factor authentication. + # See: https://guides.rubygems.org/mfa-requirement-opt-in/ + # spec.metadata["rubygems_mfa_required"] = "true" + + # Specify which files should be added to the gem when it is released. + # The `git ls-files -z` loads the files in the RubyGem that have been added into git. + gemspec = File.basename(__FILE__) + spec.files = IO.popen(%w[git ls-files -z], chdir: __dir__, err: IO::NULL) do |ls| + ls.readlines("\x0", chomp: true).reject do |f| + (f == gemspec) || + f.start_with?(*%w[bin/ Gemfile .gitignore]) + end + end + spec.bindir = "exe" + spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) } + spec.require_paths = ["lib"] + + # Uncomment to register a new dependency of your gem + # spec.add_dependency "example-gem", "~> 1.0" + + # For more information and examples about making a new gem, check out our + # guide at: https://guides.rubygems.org/make-your-own-gem/ +end diff --git a/gems/kettle-jem/benchmarks/kettle_jem_ractor_planning.rb b/gems/kettle-jem/benchmarks/kettle_jem_ractor_planning.rb new file mode 100755 index 000000000..82f2a145a --- /dev/null +++ b/gems/kettle-jem/benchmarks/kettle_jem_ractor_planning.rb @@ -0,0 +1,687 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "etc" +require "fileutils" +require "json" +require "open3" +require "rbconfig" +require "time" + +BENCHMARK_ROOT = File.expand_path(__dir__) +PROJECT_ROOT = File.expand_path("..", BENCHMARK_ROOT) +FIXTURE_ROOT = File.join(BENCHMARK_ROOT, "fixtures", "skeleton") +WORK_PARENT = File.join(PROJECT_ROOT, "tmp", "benchmarks", "work") +WORKTREE = File.join(WORK_PARENT, "skeleton") +REPORT_ROOT = File.join(PROJECT_ROOT, "tmp", "benchmarks", "reports") +SUMMARY_PATH = File.join(PROJECT_ROOT, "tmp", "benchmarks", "summary.json") +RESULTS_README = File.join(BENCHMARK_ROOT, "results", "README.md") +KETTLE_JEM_EXE = File.join(PROJECT_ROOT, "exe", "kettle-jem") +KETTLE_JEM_GEMFILE = File.join(PROJECT_ROOT, "Gemfile") +summarize_only = false +only_args = [] +remaining_args = [] +until ARGV.empty? + arg = ARGV.shift + case arg + when "--summarize-only" + summarize_only = true + when "--only" + value = ARGV.shift + raise "--only requires a value" unless value + + only_args << value + when /\A--only=(.+)\z/ + only_args << Regexp.last_match(1) + else + remaining_args << arg + end +end +raise "Unsupported arguments: #{remaining_args.join(" ")}" unless remaining_args.empty? + +SUMMARIZE_ONLY = summarize_only +STDOUT.sync = true + +RUNS = Integer(ENV.fetch("KETTLE_JEM_BENCHMARK_RUNS", "3")) +NPROCESSORS = Etc.nprocessors +HALF_NPROCESSORS = [1, NPROCESSORS / 2].max +DEFAULT_WORKER_COUNTS = [1, [4, HALF_NPROCESSORS].min, [8, HALF_NPROCESSORS].min, NPROCESSORS].uniq +WORKER_COUNTS = ENV.fetch("KETTLE_JEM_BENCHMARK_WORKERS", DEFAULT_WORKER_COUNTS.join(",")) + .split(",") + .map { |value| Integer(value.strip) } + .uniq +COMMAND = ENV.fetch("KETTLE_JEM_BENCHMARK_COMMAND", "template") +BENCHMARK_MODE = ENV.fetch("KETTLE_JEM_BENCHMARK_MODE", "install-template") +BENCHMARK_ONLY = (ENV.fetch("KETTLE_JEM_BENCHMARK_ONLY", "").split(",") + only_args.flat_map { |arg| arg.split(",") }) + .map { |token| token.strip.downcase } + .reject(&:empty?) + .uniq +VALID_BENCHMARK_ONLY = %w[baseline planning file combined ractor thread].freeze + +raise "KETTLE_JEM_BENCHMARK_RUNS must be positive" unless RUNS.positive? +raise "KETTLE_JEM_BENCHMARK_WORKERS must include at least one value" if WORKER_COUNTS.empty? +unless WORKER_COUNTS.all?(&:positive?) + raise "KETTLE_JEM_BENCHMARK_WORKERS values must be positive" +end +raise "Missing fixture skeleton at #{FIXTURE_ROOT}" unless Dir.exist?(FIXTURE_ROOT) +unless %w[plan apply template install].include?(COMMAND) + raise "Unsupported benchmark command #{COMMAND.inspect}" +end +unless %w[install-template raw-template].include?(BENCHMARK_MODE) + raise "Unsupported benchmark mode #{BENCHMARK_MODE.inspect}" +end +unknown_only = BENCHMARK_ONLY - VALID_BENCHMARK_ONLY +raise "Unsupported benchmark selector(s): #{unknown_only.join(", ")}" unless unknown_only.empty? +if COMMAND != "template" && BENCHMARK_MODE != "install-template" + raise "KETTLE_JEM_BENCHMARK_MODE=#{BENCHMARK_MODE} requires KETTLE_JEM_BENCHMARK_COMMAND=template" +end + +BASE_ENV = { + "BUNDLE_GEMFILE" => KETTLE_JEM_GEMFILE, + "STRUCTUREDMERGE_DEV" => ENV.fetch("STRUCTUREDMERGE_DEV", File.expand_path("..", PROJECT_ROOT)), + "KETTLE_JEM_ACCEPT_CONFIG" => "true", + "KETTLE_JEM_SKIP_COMMIT" => "true", + "KETTLE_JEM_SKIP_DRIFT_CHECK" => "true", + "KETTLE_JEM_SKIP_RUBOCOP_GRADUAL" => "true", + "KETTLE_JEM_SKIP_BINSTUBS" => "true", + "KETTLE_JEM_SKIP_LOCK_NORMALIZATION" => "true", + "KETTLE_JEM_TEMPLATE_PROFILE" => "full", + "KJ_REPOSITORY_TOPOLOGY" => "standalone", + "KJ_AUTHOR_NAME" => "Benchmark Author", + "KJ_AUTHOR_EMAIL" => "benchmark@example.com", + "KJ_AUTHOR_DOMAIN" => "example.com", + "KJ_GH_USER" => "benchmark", + "KJ_HOMEPAGE_URI" => "https://example.com/skeleton", + "KJ_MIN_RUBY" => ENV.fetch("KETTLE_JEM_BENCHMARK_MIN_RUBY", "1.8.7"), + "allowed" => "true", + "force" => "true", + "git_drivers" => "false", + "hook_templates" => "false" +}.freeze + +def benchmark_variants + variants = [ + { + name: "baseline-main", + family: "baseline", + worker_type: "none", + env: { + "KETTLE_JEM_RECIPE_PLANNING_STRATEGY" => "classified", + "KETTLE_JEM_RACTOR_WORKERS" => "0", + "KETTLE_JEM_THREAD_WORKERS" => "0", + "KETTLE_JEM_RACTOR_FILE_WORKERS" => "0", + "KETTLE_JEM_THREAD_FILE_WORKERS" => "0" + } + } + ] + + WORKER_COUNTS.each do |workers| + variants << { + name: "planning-ractor-#{workers}", + family: "planning", + worker_type: "ractor", + env: { + "KETTLE_JEM_RECIPE_PLANNING_STRATEGY" => "classified", + "KETTLE_JEM_RACTOR_WORKERS" => workers.to_s, + "KETTLE_JEM_THREAD_WORKERS" => "0", + "KETTLE_JEM_RACTOR_FILE_WORKERS" => "0", + "KETTLE_JEM_THREAD_FILE_WORKERS" => "0" + } + } + variants << { + name: "planning-thread-#{workers}", + family: "planning", + worker_type: "thread", + env: { + "KETTLE_JEM_RECIPE_PLANNING_STRATEGY" => "classified", + "KETTLE_JEM_RACTOR_WORKERS" => "0", + "KETTLE_JEM_THREAD_WORKERS" => workers.to_s, + "KETTLE_JEM_RACTOR_FILE_WORKERS" => "0", + "KETTLE_JEM_THREAD_FILE_WORKERS" => "0" + } + } + next if COMMAND == "plan" + + variants << { + name: "file-ractor-#{workers}", + family: "file", + worker_type: "ractor", + env: { + "KETTLE_JEM_RECIPE_PLANNING_STRATEGY" => "classified", + "KETTLE_JEM_RACTOR_WORKERS" => "0", + "KETTLE_JEM_THREAD_WORKERS" => "0", + "KETTLE_JEM_RACTOR_FILE_WORKERS" => workers.to_s, + "KETTLE_JEM_THREAD_FILE_WORKERS" => "0" + } + } + variants << { + name: "file-thread-#{workers}", + family: "file", + worker_type: "thread", + env: { + "KETTLE_JEM_RECIPE_PLANNING_STRATEGY" => "classified", + "KETTLE_JEM_RACTOR_WORKERS" => "0", + "KETTLE_JEM_THREAD_WORKERS" => "0", + "KETTLE_JEM_RACTOR_FILE_WORKERS" => "0", + "KETTLE_JEM_THREAD_FILE_WORKERS" => workers.to_s + } + } + variants << { + name: "combined-ractor-#{workers}", + family: "combined", + worker_type: "ractor", + env: { + "KETTLE_JEM_RECIPE_PLANNING_STRATEGY" => "classified", + "KETTLE_JEM_RACTOR_WORKERS" => workers.to_s, + "KETTLE_JEM_THREAD_WORKERS" => "0", + "KETTLE_JEM_RACTOR_FILE_WORKERS" => workers.to_s, + "KETTLE_JEM_THREAD_FILE_WORKERS" => "0" + } + } + variants << { + name: "combined-thread-#{workers}", + family: "combined", + worker_type: "thread", + env: { + "KETTLE_JEM_RECIPE_PLANNING_STRATEGY" => "classified", + "KETTLE_JEM_RACTOR_WORKERS" => "0", + "KETTLE_JEM_THREAD_WORKERS" => workers.to_s, + "KETTLE_JEM_RACTOR_FILE_WORKERS" => "0", + "KETTLE_JEM_THREAD_FILE_WORKERS" => workers.to_s + } + } + end + variants +end + +def selected_variants + variants = benchmark_variants + return variants if BENCHMARK_ONLY.empty? + + selected = variants.select do |variant| + variant.fetch(:name) == "baseline-main" || + BENCHMARK_ONLY.include?(variant.fetch(:family)) || + BENCHMARK_ONLY.include?(variant.fetch(:worker_type)) + end + selected_names = selected.map { |variant| variant.fetch(:name) } + if selected_names == ["baseline-main"] && !BENCHMARK_ONLY.include?("baseline") + raise "No benchmark variants matched --only #{BENCHMARK_ONLY.join(", ")}" + end + selected +end + +def reset_worktree + FileUtils.rm_rf(WORKTREE) + FileUtils.mkdir_p(WORK_PARENT) + FileUtils.cp_r(FIXTURE_ROOT, WORK_PARENT) +end + +def percentile(values, fraction) + sorted = values.sort + sorted.fetch([(sorted.length - 1) * fraction, 0].max.round) +end + +def summarize(times) + { + min: times.min, + median: percentile(times, 0.5), + max: times.max, + mean: times.sum / times.length + } +end + +def progress(message) + puts "[#{Time.now.iso8601}] #{message}" +end + +def report_snapshot(path) + report = JSON.parse(File.read(path)) + planning_execution = report.fetch("recipe_planning_execution", {}) + file_execution = report.fetch("file_work_execution", {}) + phase_timings = Array(report["phase_timings"]) + install_steps = Array(report["install_steps"]) + Array(report["template_steps"]) + command_duration_ms = install_steps.sum do |step| + command_results = Array(step["command_results"]) + if command_results.empty? + step.fetch("duration_ms", 0).to_f + else + command_results.sum { |result| result.fetch("duration_ms", 0).to_f } + end + end + readme_timings = report_readme_timings(report) + { + strategy: report["recipe_planning_strategy"], + planning_workers: report["recipe_planning_workers"], + planning_thread_workers: report.fetch("recipe_planning_thread_workers", 0), + file_workers: report.fetch("file_work_workers", 0), + file_thread_workers: report.fetch("file_work_thread_workers", 0), + worker_safe_recipes: planning_execution.fetch("worker_safe_recipes", 0), + main_only_recipes: planning_execution.fetch("main_only_recipes", 0), + ractor_spawns: planning_execution.fetch("ractor_spawn_count", 0), + ractor_recipes: planning_execution.fetch("ractor_recipe_count", 0), + thread_spawns: planning_execution.fetch("thread_spawn_count", 0), + thread_recipes: planning_execution.fetch("thread_recipe_count", 0), + file_work_units: file_execution.fetch("file_work_units", 0), + file_ractor_spawns: file_execution.fetch("file_ractor_spawn_count", 0), + file_ractor_units: file_execution.fetch("file_ractor_units", 0), + file_thread_spawns: file_execution.fetch("file_thread_spawn_count", 0), + file_thread_units: file_execution.fetch("file_thread_units", 0), + phase_duration_ms: phase_timings.sum { |entry| entry.fetch("duration_ms", 0).to_f }.round(3), + recipes_duration_ms: phase_timings.select { |entry| entry.fetch("phase", "") == "recipes" }.sum { |entry| entry.fetch("duration_ms", 0).to_f }.round(3), + apply_duration_ms: phase_timings.select { |entry| entry.fetch("phase", "") == "apply" }.sum { |entry| entry.fetch("duration_ms", 0).to_f }.round(3), + command_duration_ms: command_duration_ms.round(3), + readme_duration_ms: readme_timings.sum { |entry| entry.fetch(:duration_ms, 0).to_f }.round(3), + readme_timings: readme_timings, + recipes: Array(report["recipe_reports"]).length, + changed: Array(report["changed_files"]).length + } +end + +def report_readme_timings(report) + timings = Array(report["recipe_reports"]).flat_map do |recipe_report| + next [] unless recipe_report["relative_path"].to_s == "README.md" + + Array(recipe_report.dig("metadata", "readme_timings")) + end.compact + grouped = timings.each_with_object({}) do |timing, groups| + name = timing.fetch("name").to_s + group = groups[name] ||= {name: name, count: 0, duration_ms: 0.0} + group[:count] += 1 + group[:duration_ms] += timing.fetch("duration_ms", 0).to_f + end + grouped.values + .map { |entry| entry.merge(duration_ms: entry.fetch(:duration_ms).round(3)) } + .sort_by { |entry| -entry.fetch(:duration_ms) } +end + +def run_variant(variant, index) + report_path = File.join(REPORT_ROOT, "#{variant.fetch(:name)}-#{index}.json") + env = ENV.to_h.merge(BASE_ENV).merge(variant.fetch(:env)) + command = benchmark_command(report_path) + + progress("starting #{variant.fetch(:name)} run #{index}/#{RUNS}") + reset_worktree + prepare_raw_template_worktree(env) if raw_template_mode? + started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC) + stdout, stderr, status = Open3.capture3(env, *command, chdir: WORKTREE) + elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started_at + raise <<~MESSAGE unless status.success? + Benchmark variant #{variant.fetch(:name)} run #{index} failed with status + #{status.exitstatus}. + Command: #{command.join(" ")} + STDOUT: + #{stdout} + STDERR: + #{stderr} + MESSAGE + + snapshot = report_snapshot(report_path) + progress( + format( + "finished %s run %d/%d in %.3fs (%d recipes, %d changed, plan ractor/thread %d/%d, file ractor/thread %d/%d)", + variant: variant.fetch(:name), + index: index, + runs: RUNS, + elapsed: elapsed, + recipes: snapshot.fetch(:recipes), + changed: snapshot.fetch(:changed), + plan_ractor: snapshot.fetch(:ractor_recipes), + plan_thread: snapshot.fetch(:thread_recipes), + file_ractor: snapshot.fetch(:file_ractor_units), + file_thread: snapshot.fetch(:file_thread_units) + ) + ) + [elapsed, snapshot] +ensure + reset_worktree +end + +def benchmark_command(report_path) + command = [ + "bundle", + "exec", + "env", + "K_JEM_TEMPLATING=true", + RbConfig.ruby, + KETTLE_JEM_EXE, + COMMAND, + "--force", + "--quiet", + "--accept-config", + "--skip-commit", + "--report", + report_path + ] + command.concat(raw_template_command_options) if raw_template_mode? + command +end + +def prepare_raw_template_worktree(env) + report_path = File.join(REPORT_ROOT, "raw-template-bootstrap.json") + command = [ + "bundle", + "exec", + "env", + "K_JEM_TEMPLATING=true", + RbConfig.ruby, + KETTLE_JEM_EXE, + "template", + "--force", + "--quiet", + "--accept-config", + "--skip-commit", + "--report", + report_path, + "--only", + ".structuredmerge/kettle-jem.yml" + ] + _stdout, stderr, status = Open3.capture3(env, *command, chdir: WORKTREE) + return if status.success? + + raise <<~MESSAGE + Raw-template benchmark bootstrap failed with status #{status.exitstatus}. + Command: #{command.join(" ")} + STDERR: + #{stderr} + MESSAGE +end + +def raw_template_mode? + COMMAND == "template" && BENCHMARK_MODE == "raw-template" +end + +def raw_template_command_options + ["--only", "**/*"] +end + +def benchmark_command_label + label = "kettle-jem #{COMMAND}" + label = "#{label} #{raw_template_command_options.join(" ")}" if raw_template_mode? + label +end + +def format_seconds(value) + format("%.3fs", value) +end + +def format_baseline_delta(value, baseline) + return "n/a" if baseline.to_f.zero? + + format("%+.1f%%", ((value - baseline) / baseline) * 100.0) +end + +def format_share(value, total) + return "n/a" if total.to_f.zero? + + format("%.1f%%", (value / total) * 100.0) +end + +def timing_entry_value(entry, key, default = nil) + entry.fetch(key.to_s) { entry.fetch(key.to_sym, default) } +end + +def best_non_baseline_variant(variants) + variants + .reject { |name, _result| name.to_s == "baseline-main" } + .min_by do |_name, result| + summary = timing_entry_value(result, :summary, {}) + timing_entry_value(summary, :median, Float::INFINITY).to_f + end +end + +def readme_timing_lines(title, timings) + timing_entries = Array(timings) + return [] if timing_entries.empty? + + total = timing_entries.sum { |entry| timing_entry_value(entry, :duration_ms, 0).to_f } + lines = [ + "", + "## #{title}", + "", + "| Step | Duration | Share | Count |", + "| --- | ---: | ---: | ---: |" + ] + timing_entries.each do |entry| + duration_ms = timing_entry_value(entry, :duration_ms, 0).to_f + count = timing_entry_value(entry, :count, 0) + lines << format( + "| `%s` | %s | %s | %d |", + name: timing_entry_value(entry, :name), + duration: format_seconds(duration_ms / 1000.0), + share: format_share(duration_ms, total), + count: count + ) + end + lines +end + +def print_readme_timing_table(title, timings) + timing_entries = Array(timings) + return if timing_entries.empty? + + total = timing_entries.sum { |entry| timing_entry_value(entry, :duration_ms, 0).to_f } + puts + puts title + puts + puts format("%-44s %10s %8s %5s", "step", "duration", "share", "count") + timing_entries.each do |entry| + duration_ms = timing_entry_value(entry, :duration_ms, 0).to_f + puts format( + "%-44s %10.3fs %8s %5d", + timing_entry_value(entry, :name), + duration_ms / 1000.0, + format_share(duration_ms, total), + timing_entry_value(entry, :count, 0) + ) + end +end + +def summary_payload(results, generated_at: Time.now) + { + generated_at: generated_at.iso8601, + fixture: FIXTURE_ROOT, + command: benchmark_command_label, + mode: BENCHMARK_MODE, + only: BENCHMARK_ONLY, + runs: RUNS, + worker_counts: WORKER_COUNTS, + min_ruby: BASE_ENV.fetch("KJ_MIN_RUBY"), + report_root: REPORT_ROOT, + variants: results.transform_values do |result| + { + times: result.fetch(:times), + summary: result.fetch(:summary), + snapshot: result.fetch(:snapshot) + } + end + } +end + +def write_summary_json(payload) + FileUtils.mkdir_p(File.dirname(SUMMARY_PATH)) + File.write(SUMMARY_PATH, "#{JSON.pretty_generate(payload)}\n") +end + +def read_summary_json + raise "Missing benchmark summary at #{SUMMARY_PATH}" unless File.file?(SUMMARY_PATH) + + JSON.parse(File.read(SUMMARY_PATH)) +end + +def build_results_readme(payload) + variants = payload.fetch("variants") + snapshot_count = ->(snapshot, key) { snapshot.fetch(key, 0) } + baseline_median = variants.fetch("baseline-main").fetch("summary").fetch("median") + baseline_readme_timings = Array(variants.fetch("baseline-main").fetch("snapshot").fetch("readme_timings", [])) + best_variant_name, best_variant = best_non_baseline_variant(variants) + best_readme_timings = if best_variant + Array(best_variant.fetch("snapshot").fetch("readme_timings", [])) + else + [] + end + lines = [ + "# kettle-jem benchmark results", + "", + "Last generated: `#{payload.fetch("generated_at")}`", + "", + "| Setting | Value |", + "| --- | --- |", + "| Fixture | `#{payload.fetch("fixture")}` |", + "| Command | `#{payload.fetch("command")}` |", + "| Mode | `#{payload.fetch("mode", "install-template")}` |", + "| Only | `#{Array(payload.fetch("only", [])).empty? ? "all" : payload.fetch("only").join(", ")}` |", + "| Runs per variant | `#{payload.fetch("runs")}` |", + "| Worker counts | `#{payload.fetch("worker_counts").join(", ")}` |", + "| Minimum Ruby | `#{payload.fetch("min_ruby")}` |", + "| Source reports | `#{payload.fetch("report_root")}` |", + "", + "| Variant | +/- baseline | Min | Median | Mean | Max | Recipe phase | Command steps | Plan Ractors | Plan threads | File Ractors | File threads | Safe recipes | Plan Ractor jobs | Plan thread jobs | File units | File Ractor units | File thread units | Recipes | Changed |", + "| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |" + ] + variants.each do |name, result| + summary = result.fetch("summary") + snapshot = result.fetch("snapshot") + lines << format( + "| `%s` | %s | %s | %s | %s | %s | %s | %s | %d | %d | %d | %d | %d | %d | %d | %d | %d | %d | %d | %d |", + name: name, + baseline_delta: format_baseline_delta(summary.fetch("median"), baseline_median), + min: format_seconds(summary.fetch("min")), + median: format_seconds(summary.fetch("median")), + mean: format_seconds(summary.fetch("mean")), + max: format_seconds(summary.fetch("max")), + recipe_phase: format_seconds(snapshot_count.call(snapshot, "recipes_duration_ms") / 1000.0), + command_steps: format_seconds(snapshot_count.call(snapshot, "command_duration_ms") / 1000.0), + plan_ractors: snapshot_count.call(snapshot, "planning_workers"), + plan_threads: snapshot_count.call(snapshot, "planning_thread_workers"), + file_ractors: snapshot_count.call(snapshot, "file_workers"), + file_threads: snapshot_count.call(snapshot, "file_thread_workers"), + safe: snapshot_count.call(snapshot, "worker_safe_recipes"), + plan_ractor_recipes: snapshot_count.call(snapshot, "ractor_recipes"), + plan_thread_recipes: snapshot_count.call(snapshot, "thread_recipes"), + file_units: snapshot_count.call(snapshot, "file_work_units"), + file_ractor_units: snapshot_count.call(snapshot, "file_ractor_units"), + file_thread_units: snapshot_count.call(snapshot, "file_thread_units"), + recipes: snapshot_count.call(snapshot, "recipes"), + changed: snapshot_count.call(snapshot, "changed") + ) + end + lines.concat(readme_timing_lines("Baseline README timing breakdown", baseline_readme_timings)) + lines.concat(readme_timing_lines("Fastest non-baseline README timing breakdown (`#{best_variant_name}`)", best_readme_timings)) if best_variant_name + lines << "" + lines << "These results are generated by `ruby benchmarks/kettle_jem_ractor_planning.rb`." + lines << "Regenerate this README from the saved summary without rerunning the benchmark with:" + lines << "" + lines << "```bash" + lines << "ruby benchmarks/kettle_jem_ractor_planning.rb --summarize-only" + lines << "```" + lines << "" + "#{lines.join("\n")}\n" +end + +def write_results_readme(payload) + FileUtils.mkdir_p(File.dirname(RESULTS_README)) + File.write(RESULTS_README, build_results_readme(payload)) +end + +if SUMMARIZE_ONLY + payload = read_summary_json + write_results_readme(payload) + puts "results README: #{RESULTS_README}" + exit +end + +FileUtils.rm_rf(REPORT_ROOT) +FileUtils.mkdir_p(REPORT_ROOT) +reset_worktree + +variants = selected_variants +puts "kettle-jem Ractor planning benchmark" +puts "fixture: #{FIXTURE_ROOT}" +puts "command: #{benchmark_command_label}" +puts "mode: #{BENCHMARK_MODE}" +puts "only: #{BENCHMARK_ONLY.empty? ? "all" : BENCHMARK_ONLY.join(", ")}" +puts "runs: #{RUNS}" +puts "worker counts: #{WORKER_COUNTS.join(", ")}" +puts "variants: #{variants.length}" +puts +results = variants.to_h do |variant| + times = [] + snapshots = [] + RUNS.times do |index| + elapsed, snapshot = run_variant(variant, index + 1) + times << elapsed + snapshots << snapshot + end + [variant.fetch(:name), {times: times, summary: summarize(times), snapshot: snapshots.last}] +end + +puts +puts "summary" +puts +baseline_median = results.fetch("baseline-main").fetch(:summary).fetch(:median) +puts format( + "%-28s %8s %8s %8s %8s %8s %8s %8s %4s %4s %4s %4s %4s %4s %4s %4s %4s %4s %7s %7s", + "variant", + "+/-", + "min", + "median", + "mean", + "max", + "recipes", + "cmds", + "pr", + "pt", + "fr", + "ft", + "safe", + "f_units", + "pr_job", + "pt_job", + "fr_job", + "ft_job", + "recipes", + "changed" +) +results.each do |name, result| + summary = result.fetch(:summary) + snapshot = result.fetch(:snapshot) + puts format( + "%-28s %8s %8.3fs %8.3fs %8.3fs %8.3fs %8.3fs %8.3fs %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %7d %7d", + name, + format_baseline_delta(summary.fetch(:median), baseline_median), + summary.fetch(:min), + summary.fetch(:median), + summary.fetch(:mean), + summary.fetch(:max), + snapshot.fetch(:recipes_duration_ms) / 1000.0, + snapshot.fetch(:command_duration_ms) / 1000.0, + snapshot.fetch(:planning_workers), + snapshot.fetch(:planning_thread_workers), + snapshot.fetch(:file_workers), + snapshot.fetch(:file_thread_workers), + snapshot.fetch(:worker_safe_recipes), + snapshot.fetch(:file_work_units), + snapshot.fetch(:ractor_recipes), + snapshot.fetch(:thread_recipes), + snapshot.fetch(:file_ractor_units), + snapshot.fetch(:file_thread_units), + snapshot.fetch(:recipes), + snapshot.fetch(:changed) + ) +end +baseline_readme_timings = Array(results.fetch("baseline-main").fetch(:snapshot).fetch(:readme_timings, [])) +print_readme_timing_table("baseline README timings", baseline_readme_timings) +best_variant_name, best_variant = best_non_baseline_variant(results) +if best_variant_name + best_readme_timings = Array(best_variant.fetch(:snapshot).fetch(:readme_timings, [])) + print_readme_timing_table("#{best_variant_name} README timings", best_readme_timings) +end + +payload = summary_payload(results) +write_summary_json(payload) +write_results_readme(JSON.parse(JSON.generate(payload))) + +puts +puts "reports: #{REPORT_ROOT}" +puts "summary: #{SUMMARY_PATH}" +puts "results README: #{RESULTS_README}" diff --git a/gems/kettle-jem/benchmarks/results/README.md b/gems/kettle-jem/benchmarks/results/README.md new file mode 100644 index 000000000..7aa63cca9 --- /dev/null +++ b/gems/kettle-jem/benchmarks/results/README.md @@ -0,0 +1,78 @@ +# kettle-jem benchmark results + +Last generated: `2026-07-20T22:47:34-06:00` + +| Setting | Value | +| --- | --- | +| Fixture | `/var/home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem/benchmarks/fixtures/skeleton` | +| Command | `kettle-jem template` | +| Mode | `install-template` | +| Only | `combined` | +| Runs per variant | `3` | +| Worker counts | `1, 4, 8, 22` | +| Minimum Ruby | `1.8.7` | +| Source reports | `/var/home/pboling/src/my/structuredmerge/ruby/gems/kettle-jem/tmp/benchmarks/reports` | + +| Variant | +/- baseline | Min | Median | Mean | Max | Recipe phase | Command steps | Plan Ractors | Plan threads | File Ractors | File threads | Safe recipes | Plan Ractor jobs | Plan thread jobs | File units | File Ractor units | File thread units | Recipes | Changed | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | +| `baseline-main` | +0.0% | 13.106s | 13.335s | 13.300s | 13.460s | 8.032s | 3.086s | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 132 | 0 | 0 | 146 | 134 | +| `combined-ractor-1` | +7.5% | 13.951s | 14.331s | 14.598s | 15.513s | 10.125s | 3.107s | 1 | 0 | 1 | 0 | 2 | 2 | 0 | 132 | 132 | 0 | 146 | 134 | +| `combined-thread-1` | +2.9% | 12.697s | 13.727s | 13.712s | 14.712s | 8.372s | 3.122s | 0 | 1 | 0 | 1 | 2 | 0 | 140 | 132 | 0 | 132 | 146 | 134 | +| `combined-ractor-4` | +13.3% | 14.953s | 15.110s | 15.415s | 16.181s | 9.326s | 3.197s | 4 | 0 | 4 | 0 | 2 | 2 | 0 | 132 | 132 | 0 | 146 | 134 | +| `combined-thread-4` | -2.4% | 12.724s | 13.017s | 13.158s | 13.733s | 8.385s | 3.254s | 0 | 4 | 0 | 4 | 2 | 0 | 140 | 132 | 0 | 132 | 146 | 134 | +| `combined-ractor-8` | +9.0% | 14.249s | 14.529s | 14.679s | 15.258s | 9.748s | 3.225s | 8 | 0 | 8 | 0 | 2 | 2 | 0 | 132 | 132 | 0 | 146 | 134 | +| `combined-thread-8` | -7.1% | 12.283s | 12.394s | 12.662s | 13.308s | 7.538s | 2.939s | 0 | 8 | 0 | 8 | 2 | 0 | 140 | 132 | 0 | 132 | 146 | 134 | +| `combined-ractor-22` | +8.5% | 13.665s | 14.468s | 14.277s | 14.699s | 8.604s | 3.019s | 22 | 0 | 22 | 0 | 2 | 2 | 0 | 132 | 132 | 0 | 146 | 134 | +| `combined-thread-22` | -6.1% | 12.438s | 12.521s | 12.581s | 12.785s | 7.709s | 3.079s | 0 | 22 | 0 | 22 | 2 | 0 | 140 | 132 | 0 | 132 | 146 | 134 | + +## Baseline README timing breakdown + +| Step | Duration | Share | Count | +| --- | ---: | ---: | ---: | +| `prepare.integration_badges` | 0.479s | 16.8% | 1 | +| `postprocess.readme_post_processor` | 0.453s | 15.9% | 3 | +| `readme.append_used_link_definitions` | 0.391s | 13.7% | 1 | +| `postprocess.conditional_blocks` | 0.286s | 10.0% | 3 | +| `postprocess.logo_link_prune` | 0.222s | 7.8% | 3 | +| `postprocess.badge_policy` | 0.215s | 7.5% | 3 | +| `readme.merge_template` | 0.209s | 7.3% | 1 | +| `badge_policy.fossa` | 0.120s | 4.2% | 3 | +| `postprocess.metadata_block` | 0.108s | 3.8% | 3 | +| `postprocess.project_heading` | 0.099s | 3.5% | 3 | +| `badge_policy.codetriage` | 0.095s | 3.3% | 3 | +| `prepare.remove_sections` | 0.094s | 3.3% | 1 | +| `postprocess.synopsis_heading` | 0.086s | 3.0% | 3 | +| `postprocess.blank_lines` | 0.000s | 0.0% | 3 | +| `postprocess.kloc_badge` | 0.000s | 0.0% | 3 | +| `postprocess.monorepo_thin_projection` | 0.000s | 0.0% | 3 | +| `postprocess.monorepo_subgem_recipe` | 0.000s | 0.0% | 3 | + +## Fastest non-baseline README timing breakdown (`combined-thread-8`) + +| Step | Duration | Share | Count | +| --- | ---: | ---: | ---: | +| `postprocess.kloc_badge` | 1.016s | 29.0% | 3 | +| `prepare.integration_badges` | 0.546s | 15.6% | 1 | +| `postprocess.readme_post_processor` | 0.388s | 11.1% | 3 | +| `readme.append_used_link_definitions` | 0.318s | 9.1% | 1 | +| `postprocess.conditional_blocks` | 0.228s | 6.5% | 3 | +| `readme.merge_template` | 0.166s | 4.7% | 1 | +| `postprocess.logo_link_prune` | 0.158s | 4.5% | 3 | +| `postprocess.badge_policy` | 0.156s | 4.5% | 3 | +| `prepare.remove_sections` | 0.121s | 3.5% | 1 | +| `postprocess.metadata_block` | 0.101s | 2.9% | 3 | +| `postprocess.project_heading` | 0.083s | 2.4% | 3 | +| `badge_policy.fossa` | 0.081s | 2.3% | 3 | +| `badge_policy.codetriage` | 0.075s | 2.1% | 3 | +| `postprocess.synopsis_heading` | 0.068s | 1.9% | 3 | +| `postprocess.blank_lines` | 0.000s | 0.0% | 3 | +| `postprocess.monorepo_thin_projection` | 0.000s | 0.0% | 3 | +| `postprocess.monorepo_subgem_recipe` | 0.000s | 0.0% | 3 | + +These results are generated by `ruby benchmarks/kettle_jem_ractor_planning.rb`. +Regenerate this README from the saved summary without rerunning the benchmark with: + +```bash +ruby benchmarks/kettle_jem_ractor_planning.rb --summarize-only +``` + diff --git a/gems/kettle-jem/docs/Kettle.html b/gems/kettle-jem/docs/Kettle.html index 26e571d62..3afc5c43e 100644 --- a/gems/kettle-jem/docs/Kettle.html +++ b/gems/kettle-jem/docs/Kettle.html @@ -6,7 +6,7 @@ Module: Kettle - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -110,9 +110,9 @@

Defined Under Namespace

diff --git a/gems/kettle-jem/docs/Kettle/Jem.html b/gems/kettle-jem/docs/Kettle/Jem.html index 8d1c42517..c238173d2 100644 --- a/gems/kettle-jem/docs/Kettle/Jem.html +++ b/gems/kettle-jem/docs/Kettle/Jem.html @@ -6,7 +6,7 @@ Module: Kettle::Jem - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -96,7 +96,7 @@

Defined Under Namespace

- Classes: DecisionEvaluation, DecisionPolicy, Error, GemSpecReader, PluginContext, PluginHelpers, PluginOutput, PluginRegistrar, PluginRegistry, RRRRBMatrixEntry, RubyGemsResolver + Classes: DecisionEvaluation, DecisionPolicy, Error, EventStream, GemSpecReader, PluginContext, PluginHelpers, PluginOutput, PluginRegistrar, PluginRegistry, RubyGemsResolver

@@ -139,6 +139,13 @@

"# <</kettle-jem:generated>>"
+
GEMSPEC_DEPENDENCY_MINIMUM_REQUIREMENTS = + +
+
{
+  "rspec-stubbed_env" => ">= 1.0.6"
+}.freeze
+
OBSOLETE_GITHUB_WORKFLOWS =
@@ -177,60 +184,10 @@

%w[ruby jruby truffleruby].freeze
-
RRRRB_MATRIX = +
DEFAULT_OPENCOLLECTIVE_ORG =
-
{
-  "ruby-1.8" => RRRRBMatrixEntry.new(ruby: "1.8.7-p374", engine: "ruby", rails: "4.0.x", rubocop_lts: "0.3.0"),
-  "ruby-1.9" => RRRRBMatrixEntry.new(ruby: "1.9.3-p551", engine: "ruby", rubygems: "2.7.11", bundler: "1.17.3", rubocop: "0.41.2", rubocop_lts: "2.3.0", rails: "4.2.11.3"),
-  "jruby-1.7" => RRRRBMatrixEntry.new(ruby: "jruby-1.7.27", engine: "jruby", mri: "1.9", workflow_ruby: "1.9"),
-  "ruby-2.0" => RRRRBMatrixEntry.new(ruby: "2.0.0-p648", engine: "ruby", rubocop: "0.50.0", rubocop_lts: "4.2.0"),
-  "ruby-2.1" => RRRRBMatrixEntry.new(ruby: "2.1.10", engine: "ruby", rubocop: "0.57.2", rubocop_lts: "6.3.0"),
-  "ruby-2.2" => RRRRBMatrixEntry.new(ruby: "2.2.10", engine: "ruby", rubocop: "0.68.1", rubocop_lts: "8.3.0", rails: "5.2.8.1"),
-  "ruby-2.3" => RRRRBMatrixEntry.new(ruby: "2.3.8", engine: "ruby", rubygems: "3.3.27", bundler: "2.3.27", rubocop: "0.81.0", rubocop_lts: "10.3.0"),
-  "jruby-9.1" => RRRRBMatrixEntry.new(ruby: "jruby-9.1.17.0", engine: "jruby", mri: "2.3", workflow_ruby: "2.3", rubygems: "3.3.27", bundler: "2.3.27"),
-  "ruby-2.4" => RRRRBMatrixEntry.new(ruby: "2.4.10", engine: "ruby", rubocop: "1.12.1", rubocop_lts: "12.3.0", rails_appraisals: ["4.2.11.3", "5.2.8.1"]),
-  "ruby-2.5" => RRRRBMatrixEntry.new(ruby: "2.5.9", engine: "ruby", rubocop: "1.28.2", rubocop_lts: "14.3.0", rails: "6.0.6.1"),
-  "jruby-9.2" => RRRRBMatrixEntry.new(ruby: "jruby-9.2.21.0", engine: "jruby", mri: "2.5", workflow_ruby: "2.5", rubygems: "3.3.27", bundler: "2.3.27"),
-  "ruby-2.6" => RRRRBMatrixEntry.new(ruby: "2.6.10", engine: "ruby", rubygems: "3.4.22", bundler: "2.4.22", rubocop: "1.50.2", rubocop_lts: "16.3.0", rails: "6.1.7.10"),
-  "jruby-9.3" => RRRRBMatrixEntry.new(ruby: "jruby-9.3.15.0", engine: "jruby", mri: "2.6", workflow_ruby: "2.6", notes: ["JRuby 9.3 can require jar-dependencies ~> 0.4.1 when psych activates a newer default gem stack."]),
-  "ruby-2.7" => RRRRBMatrixEntry.new(ruby: "2.7.8", engine: "ruby", rubocop: "1.80.x", rubocop_lts: "18.4.0", rails: "7.2.2.2"),
-  "ruby-3.0" => RRRRBMatrixEntry.new(ruby: "3.0.7", engine: "ruby", rubygems: "3.5.23", bundler: "2.5.23", rubocop_lts: "20.4.0"),
-  "truffleruby-22.3" => RRRRBMatrixEntry.new(ruby: "truffleruby-22.3.1", engine: "truffleruby", mri: "3.0", workflow_ruby: "3.0", notes: ["Do not upgrade RubyGems or Bundler on TruffleRuby."]),
-  "ruby-3.1" => RRRRBMatrixEntry.new(ruby: "3.1.7", engine: "ruby", rubygems: "3.6.9", bundler: "2.6.9", rubocop_lts: "22.3.0"),
-  "truffleruby-23.0" => RRRRBMatrixEntry.new(ruby: "truffleruby-23.0.0", engine: "truffleruby", mri: "3.1", workflow_ruby: "3.0", notes: ["Do not upgrade RubyGems or Bundler on TruffleRuby.", "psych < 5.3 is needed while Gem.ruby_version is below 3.3."]),
-  "jruby-9.4" => RRRRBMatrixEntry.new(ruby: "jruby-9.4.12.x", engine: "jruby", mri: "3.1", workflow_ruby: "3.1"),
-  "ruby-3.2" => RRRRBMatrixEntry.new(ruby: "3.2.9", engine: "ruby", rubygems: "3.7.x", bundler: "2.7.x", rubocop_lts: "24.2.0", rails: "8.0.x"),
-  "truffleruby-23.1" => RRRRBMatrixEntry.new(ruby: "truffleruby-23.1.2", engine: "truffleruby", mri: "3.2", workflow_ruby: "3.1", notes: ["Do not upgrade RubyGems or Bundler on TruffleRuby.", "Use the Ruby 3.1/Rails 7.2 appraisal in CI; Rails 8 failed on this engine.", "psych < 5.3 is needed while Gem.ruby_version is below 3.3."]),
-  "ruby-3.3" => RRRRBMatrixEntry.new(ruby: "3.3.9", engine: "ruby"),
-  "truffleruby-24.2" => RRRRBMatrixEntry.new(ruby: "truffleruby-24.2.x", engine: "truffleruby", mri: "3.3", workflow_ruby: "3.3", notes: ["Do not upgrade RubyGems or Bundler on TruffleRuby."]),
-  "truffleruby-25.0" => RRRRBMatrixEntry.new(ruby: "truffleruby-25.0.x", engine: "truffleruby", mri: "3.3", workflow_ruby: "3.3", notes: ["Do not upgrade RubyGems or Bundler on TruffleRuby."]),
-  "ruby-3.4" => RRRRBMatrixEntry.new(ruby: "3.4.7", engine: "ruby")
-}.transform_values(&:freeze).freeze
- -
ENGINE_WORKFLOW_MAP = - -
-
{
-  "jruby" => "jruby",
-  "jruby-9.1" => "jruby",
-  "jruby-9.2" => "jruby",
-  "jruby-9.3" => "jruby",
-  "jruby-9.4" => "jruby",
-  "truffle" => "truffleruby",
-  "truffleruby-22.3" => "truffleruby",
-  "truffleruby-23.0" => "truffleruby",
-  "truffleruby-23.1" => "truffleruby",
-  "truffleruby-24.2" => "truffleruby",
-  "truffleruby-25.0" => "truffleruby"
-}.freeze
- -
ENGINE_WORKFLOW_RUBY_COMPATIBILITY_FLOORS = - -
-
RRRRB_MATRIX.each_with_object({}) do |(name, entry), result|
-  result[name] = entry.workflow_ruby if entry.workflow_ruby
-end.freeze
+
"galtzo-floss"
RETIRED_GEMSPEC_DEVELOPMENT_DEPENDENCIES = @@ -248,6 +205,7 @@

supplied_disabled_opencollective_file_deletion supplied_legacy_destination_file_deletion supplied_obsolete_license_file_deletion + supplied_shim_profile_file_deletion ].freeze
PHASE_ORDER = @@ -272,6 +230,11 @@

File.expand_path("jem/templates", __dir__)
+
TRANSFER_CHANGELOG_TEMPLATE_PATH = + +
+
"CHANGELOG.transfer.md"
+
COPY_ONLY_WHEN_MISSING_TEMPLATE_PATHS =
@@ -302,6 +265,11 @@

MONOREPO_SUBGEM_PACKAGE_TEMPLATE_PROFILE
+
SHIM_TEMPLATE_PROFILE = + +
+
"shim"
+
FULL_TEMPLATE_PROFILE =
@@ -334,6 +302,7 @@

"Rakefile", "SECURITY.md", ".github/FUNDING.yml", + ".gitignore", ".structuredmerge/git-drivers.toml" ].freeze @@ -348,6 +317,7 @@

"PolyForm-Noncommercial-1.0.0.md", "PolyForm-Small-Business-1.0.0.md", "Big-Time-Public-License.md", + "Gemfile", "certs/pboling.pem", "tmp/.gitignore" ].freeze @@ -377,12 +347,75 @@

] + PACKAGED_MODULAR_GEMFILE_TEMPLATE_ENTRIES ).freeze +
SHIM_TEMPLATE_STATIC_ENTRIES = + +
+
[
+  "README.md",
+  "CHANGELOG.md",
+  "Gemfile",
+  "Rakefile",
+  ".gitignore",
+  ".rspec",
+  "gemfiles/modular/templating.gemfile",
+  "gemfiles/modular/templating_local.gemfile",
+  "spec/spec_helper.rb",
+  "spec/shim_spec.rb",
+  ".github/workflows/current.yml",
+  ".structuredmerge/kettle-jem.yml"
+].freeze
+ +
SHIM_TEMPLATE_SOURCE_TARGETS = + +
+
{
+  "README.md" => "shim/README.md",
+  "CHANGELOG.md" => "shim/CHANGELOG.md",
+  "Gemfile" => "shim/Gemfile",
+  "Rakefile" => "shim/Rakefile",
+  ".rspec" => "shim/.rspec",
+  "spec/spec_helper.rb" => "shim/spec/spec_helper.rb",
+  "spec/shim_spec.rb" => "shim/spec/shim_spec.rb",
+  ".github/workflows/current.yml" => "shim/.github/workflows/current.yml",
+  ".structuredmerge/kettle-jem.yml" => "shim/.structuredmerge/kettle-jem.yml"
+}.freeze
+ +
SHIM_PROFILE_CLEANUP_GLOBS = + +
+
[
+  "Appraisal.root.gemfile",
+  "Appraisals",
+  "Guardfile",
+  ".simplecov",
+  ".yardignore",
+  ".yardopts",
+  ".github/FUNDING.yml",
+  ".gitattributes",
+  "bin/*",
+  "gemfiles/**/*.gemfile",
+  "sig/**/*.rbs",
+  "spec/**/*_spec.rb",
+  "spec/support/**/*",
+  ".github/workflows/*.yml",
+  "lib/**/*.rb",
+  "*.gemspec"
+].freeze
+ +
EXECUTABLE_GIT_HOOK_PATHS = + +
+
%w[
+  .git-hooks/commit-msg
+  .git-hooks/prepare-commit-msg
+].freeze
+
VERSION_GEM_TEMPLATE_SOURCES =
[
   "lib/gem/version.rb",
-  "sig/gem/version.rbs"
+  "sig/gem.rbs"
 ].freeze
KETTLE_CONFIG_ENV_SYNC_PATHS = @@ -395,6 +428,8 @@

%w[yard_host] => "KJ_YARD_HOST", %w[homepage_uri] => "KJ_HOMEPAGE_URI", %w[templates profile] => "KETTLE_JEM_TEMPLATE_PROFILE", + %w[shim replacement_gem] => "KETTLE_JEM_SHIMMED_GEM", + %w[shim replacement_require] => "KETTLE_JEM_SHIMMED_REQUIRE", %w[workflows exec_cmd] => "KJ_EXEC_CMD", %w[tokens forge gh_user] => "KJ_GH_USER", %w[tokens forge gl_user] => "KJ_GL_USER", @@ -406,13 +441,11 @@

%w[tokens author email] => "KJ_AUTHOR_EMAIL", %w[tokens author domain] => "KJ_AUTHOR_DOMAIN", %w[tokens author orcid] => "KJ_AUTHOR_ORCID", - %w[tokens funding patreon] => "KJ_FUNDING_PATREON", %w[tokens funding kofi] => "KJ_FUNDING_KOFI", + %w[tokens funding open_collective] => %w[OPENCOLLECTIVE_HANDLE FUNDING_ORG], %w[tokens funding paypal] => "KJ_FUNDING_PAYPAL", %w[tokens funding buymeacoffee] => "KJ_FUNDING_BUYMEACOFFEE", - %w[tokens funding polar] => "KJ_FUNDING_POLAR", %w[tokens funding liberapay] => "KJ_FUNDING_LIBERAPAY", - %w[tokens funding issuehunt] => "KJ_FUNDING_ISSUEHUNT", %w[tokens social mastodon] => "KJ_SOCIAL_MASTODON", %w[tokens social bluesky] => "KJ_SOCIAL_BLUESKY", %w[tokens social linktree] => "KJ_SOCIAL_LINKTREE", @@ -442,6 +475,15 @@

SECURITY ].freeze +
KNOWN_LICENSE_TEMPLATE_BASENAMES = + +
+
Dir.glob(File.join(PACKAGED_TEMPLATE_ROOT, "*.md.example"))
+.map { |path| File.basename(path, ".md.example") }
+.reject { |basename| NON_LICENSE_MD_BASENAMES.include?(basename) }
+.to_set
+.freeze
+
MONOREPO_SUBGEM_README_BLOB_PATHS =
@@ -454,6 +496,52 @@

SECURITY.md ].freeze +
README_DEV_TEST_STACK_GEMS = + +
+
[
+  {
+    name: "appraisal2",
+    repo: "https://github.com/appraisal-rb/appraisal2",
+    role: "multi-dependency Appraisal matrix generation"
+  },
+  {
+    name: "appraisal2-rubocop",
+    repo: "https://github.com/appraisal-rb/appraisal2-rubocop",
+    role: "RuboCop Appraisal generator integration"
+  },
+  {
+    name: "kettle-dev",
+    repo: "https://github.com/kettle-dev/kettle-dev",
+    role: "development, release, and CI workflow tooling"
+  },
+  {
+    name: "kettle-jem",
+    repo: "https://github.com/kettle-dev/kettle-jem",
+    role: "Appraisals & CI workflow templates"
+  },
+  {
+    name: "kettle-soup-cover",
+    repo: "https://github.com/kettle-dev/kettle-soup-cover",
+    role: "SimpleCov coverage policy and reporting"
+  },
+  {
+    name: "kettle-test",
+    repo: "https://github.com/kettle-dev/kettle-test",
+    role: "standard test runner and coverage harness"
+  },
+  {
+    name: "rubocop-lts",
+    repo: "https://github.com/rubocop-lts/rubocop-lts",
+    role: "Ruby-version-aware linting"
+  },
+  {
+    name: "turbo_tests2",
+    repo: "https://github.com/galtzo-floss/turbo_tests2",
+    role: "parallel test execution"
+  }
+].freeze
+
MONOREPO_SUBGEM_THIN_README_KEEP_HEADINGS =
@@ -507,6 +595,34 @@

"template_fallback_when_missing"
+
EVENT_TYPES = + +
+
%w[
+  run_start
+  phase_start
+  phase_finish
+  recipe
+  post_apply_step
+  command_step
+  diagnostic
+  summary
+].freeze
+ +
DEFAULT_EVENT_TYPES = + +
+
EVENT_TYPES.freeze
+ +
EVENT_TYPE_ALIASES = + +
+
{
+  "all" => EVENT_TYPES,
+  "default" => DEFAULT_EVENT_TYPES,
+  "progress" => %w[run_start phase_start phase_finish recipe post_apply_step command_step summary]
+}.freeze
+
RUBY_TEMPLATE_BASENAMES =
@@ -536,12 +652,10 @@

KJ|AUTHOR:DOMAIN KJ|AUTHOR:NAME KJ|FUNDING:BUYMEACOFFEE - KJ|FUNDING:ISSUEHUNT KJ|FUNDING:KOFI KJ|FUNDING:LIBERAPAY - KJ|FUNDING:PATREON KJ|FUNDING:PAYPAL - KJ|FUNDING:POLAR + KJ|GEMSPEC:PACKAGE_FILE_INCLUDES KJ|GH:USER KJ|GH_ORG KJ|GL:USER @@ -549,6 +663,8 @@

KJ|LICENSE_EYE:DEPENDENCY_LICENSES KJ|LICENSE_EYE:MODE KJ|LICENSE_EYE:PRIMARY_SPDX + KJ|MAIN_GEMFILE_DIRECT_SIBLING_BLOCK + KJ|MAIN_GEMFILE_NOMONO_BOOTSTRAP KJ|MIN_DIVERGENCE_THRESHOLD KJ|MIN_RUBY KJ|OPENCOLLECTIVE_ORG @@ -557,6 +673,7 @@

KJ|README:LICENSE_BADGE KJ|README:LICENSE_COMPAT_BADGE KJ|README:LICENSE_EYE_WORKFLOW_BADGE + KJ|README:DEV_TEST_STACK_TABLE KJ|README:FOSSA_BADGE KJ|README:FOSSA_REFS KJ|README:H2_SYNOPSIS_LOGO_ROW @@ -564,7 +681,12 @@

KJ|README:LICENSE_REFS KJ|README:TOP_LOGO_REFS KJ|README:TOP_LOGO_ROW + KJ|RUBY_STYLE:TRAILING_ARRAY_COMMA KJ|SH:USER + KJ|SHIMMED_GEM_NAME + KJ|SHIMMED_REQUIRE + KJ|SHIM_COMPAT_REQUIRES + KJ|SHIMMED_GEMFILE_OVERRIDE KJ|SOCIAL:BLUESKY KJ|SOCIAL:DEVTO KJ|SOCIAL:LINKTREE @@ -760,6 +882,11 @@

%w[MIT].freeze
+
SKYWALKING_EYES_INTEGRATION = + +
+
"skywalking-eyes"
+
README_OPEN_COLLECTIVE_FUNDING_BADGES =
@@ -784,7 +911,38 @@

README_INTEGRATIONS =
-
%w[codecov coveralls qlty codeql].freeze
+
%w[codecov coveralls qlty codeql skywalking-eyes].freeze
+ +
README_DISCOVERED_INTEGRATIONS = + +
+
(README_INTEGRATIONS - [SKYWALKING_EYES_INTEGRATION]).freeze
+ +
COVERAGE_INTEGRATIONS = + +
+
%w[codecov coveralls qlty].freeze
+ +
MANAGED_INTEGRATIONS = + +
+
(COVERAGE_INTEGRATIONS + [SKYWALKING_EYES_INTEGRATION]).freeze
+ +
COVERAGE_INTEGRATION_CONFIG_PATHS = + +
+
{
+  "codecov" => %w[.github/.codecov.yml codecov.yml .codecov.yml],
+  "coveralls" => %w[.coveralls.yml],
+  "qlty" => %w[.qlty/qlty.toml .qlty.yml]
+}.freeze
+ +
INTEGRATION_TEMPLATE_PATHS = + +
+
COVERAGE_INTEGRATION_CONFIG_PATHS.merge(
+  SKYWALKING_EYES_INTEGRATION => %w[.licenserc.yaml .github/workflows/license-eye.yml .github/workflows/license-eye.yaml]
+).freeze
README_INTEGRATION_BADGE_PATTERNS = @@ -803,6 +961,9 @@

], "codeql" => [ /\s*\[!\[CodeQL\]\[[^\]]+\]\]\[[^\]]+\]/ + ], + "skywalking-eyes" => [ + /\s*\[!\[Apache SkyWalking Eyes License Compatibility Check\]\[[^\]]+\]\]\[[^\]]+\]/ ] }.freeze @@ -813,7 +974,8 @@

"codecov" => %w[🏀codecov 🏀codecovi 🏀codecov-g], "coveralls" => %w[🏀coveralls 🏀coveralls-img], "qlty" => %w[🏀qlty-mnt 🏀qlty-mnti 🏀qlty-cov 🏀qlty-covi], - "codeql" => %w[🖐codeQL 🖐codeQL-img] + "codeql" => %w[🖐codeQL 🖐codeQL-img], + "skywalking-eyes" => README_LICENSE_EYE_WORKFLOW_LINK_LABELS }.freeze
README_SECTION_ALIASES = @@ -836,25 +998,6 @@

%r{/var/home(?=/|\z)}
-
RUBOCOP_VERSION_MAP = - -
-
[
-  [Gem::Version.new("1.8"), "\"~> 0.3\", \">= 0.3.0\"", "rubocop-ruby1_8", "\"~> 2.0\", \">= 2.0.2\""],
-  [Gem::Version.new("1.9"), "\"~> 2.3\", \">= 2.3.0\"", "rubocop-ruby1_9", "\"~> 3.0\", \">= 3.0.2\""],
-  [Gem::Version.new("2.0"), "\"~> 4.2\", \">= 4.2.0\"", "rubocop-ruby2_0", "\"~> 3.0\", \">= 3.0.2\""],
-  [Gem::Version.new("2.1"), "\"~> 6.3\", \">= 6.3.0\"", "rubocop-ruby2_1", "\"~> 3.0\", \">= 3.0.2\""],
-  [Gem::Version.new("2.2"), "\"~> 8.3\", \">= 8.3.0\"", "rubocop-ruby2_2", "\"~> 3.0\", \">= 3.0.2\""],
-  [Gem::Version.new("2.3"), "\"~> 10.3\", \">= 10.3.0\"", "rubocop-ruby2_3", "\"~> 3.0\", \">= 3.0.2\""],
-  [Gem::Version.new("2.4"), "\"~> 12.3\", \">= 12.3.0\"", "rubocop-ruby2_4", "\"~> 3.0\", \">= 3.0.2\""],
-  [Gem::Version.new("2.5"), "\"~> 14.3\", \">= 14.3.0\"", "rubocop-ruby2_5", "\"~> 3.0\", \">= 3.0.2\""],
-  [Gem::Version.new("2.6"), "\"~> 16.3\", \">= 16.3.0\"", "rubocop-ruby2_6", "\"~> 3.0\", \">= 3.0.2\""],
-  [Gem::Version.new("2.7"), "\"~> 18.4\", \">= 18.4.0\"", "rubocop-ruby2_7", "\"~> 3.0\", \">= 3.0.2\""],
-  [Gem::Version.new("3.0"), "\"~> 20.4\", \">= 20.4.0\"", "rubocop-ruby3_0", "\"~> 3.0\", \">= 3.0.2\""],
-  [Gem::Version.new("3.1"), "\"~> 22.3\", \">= 22.3.0\"", "rubocop-ruby3_1", "\"~> 3.0\", \">= 3.0.2\""],
-  [Gem::Version.new("3.2"), "\"~> 24.2\", \">= 24.2.0\"", "rubocop-ruby3_2", "\"~> 3.0\", \">= 3.0.2\""]
-].freeze
-
FORGE_USER_ENV_KEYS =
@@ -869,13 +1012,10 @@

{
-  patreon: "KJ_FUNDING_PATREON",
   kofi: "KJ_FUNDING_KOFI",
   paypal: "KJ_FUNDING_PAYPAL",
   buymeacoffee: "KJ_FUNDING_BUYMEACOFFEE",
-  polar: "KJ_FUNDING_POLAR",
-  liberapay: "KJ_FUNDING_LIBERAPAY",
-  issuehunt: "KJ_FUNDING_ISSUEHUNT"
+  liberapay: "KJ_FUNDING_LIBERAPAY"
 }.freeze
SOCIAL_TOKEN_ENV_KEYS = @@ -1018,6 +1158,29 @@

+
+
+ + + + +
  • + + + .adapter_failure_template_source_error(file_type, recipe) ⇒ Object + + + + + + + + + + + + +
    @@ -1087,6 +1250,52 @@

    +
    +
    + +

  • + + +
  • + + + .add_shim_bootstrap_config(content, shim) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .add_shim_file_overrides(content, gemspec_path) ⇒ Object + + + + + + + + + + + + +
    @@ -1142,7 +1351,7 @@

  • - .append_github_actions_coverage_steps(content) ⇒ Object + .append_github_actions_coverage_steps(content, disabled_integrations: []) ⇒ Object @@ -1225,6 +1434,29 @@

    +
    +
    + +

  • + + +
  • + + + .apply_changelog_transfer_entries(content, entries) ⇒ Object + + + + + + + + + + + + +
    @@ -1593,6 +1825,29 @@

    +
    +
    + +

  • + + +
  • + + + .apply_shim_template_profile(content, gemspec_path) ⇒ Object + + + + + + + + + + + + +
    @@ -3074,7 +3329,7 @@

  • - .changelog_unreleased_end_index(lines, unreleased_index) ⇒ Object + .changelog_transfer_entries(template_root) ⇒ Object @@ -3097,7 +3352,7 @@

  • - .changelog_unreleased_heading?(heading_text) ⇒ Boolean + .changelog_transfer_key(line) ⇒ Object @@ -3120,7 +3375,7 @@

  • - .changelog_unreleased_heading_line?(line) ⇒ Boolean + .changelog_transfer_keys(content) ⇒ Object @@ -3143,7 +3398,7 @@

  • - .changelog_unreleased_items(body_lines) ⇒ Object + .changelog_unreleased_end_index(lines, unreleased_index) ⇒ Object @@ -3166,7 +3421,7 @@

  • - .changelog_unreleased_line_index(lines) ⇒ Object + .changelog_unreleased_heading?(heading_text) ⇒ Boolean @@ -3189,7 +3444,7 @@

  • - .changelog_version_heading_line?(line, version) ⇒ Boolean + .changelog_unreleased_heading_line?(line) ⇒ Boolean @@ -3212,7 +3467,7 @@

  • - .classify_namespace(name) ⇒ Object + .changelog_unreleased_items(body_lines) ⇒ Object @@ -3235,7 +3490,7 @@

  • - .codeberg_repo_url(repository, repo_slug, suffix) ⇒ Object + .changelog_unreleased_line_index(lines) ⇒ Object @@ -3258,7 +3513,7 @@

  • - .collapse_excess_blank_lines(content) ⇒ Object + .changelog_version_heading_line?(line, version) ⇒ Boolean @@ -3281,7 +3536,7 @@

  • - .collect_changelog_list_item(lines, start_index) ⇒ Object + .classify_namespace(name) ⇒ Object @@ -3304,7 +3559,7 @@

  • - .collect_yaml_scalar_path_entries(node, path, entries) ⇒ Object + .codeberg_repo_url(repository, repo_slug, suffix) ⇒ Object @@ -3327,7 +3582,7 @@

  • - .commented_gem_call(comment_source) ⇒ Object + .collapse_excess_blank_lines(content) ⇒ Object @@ -3350,7 +3605,7 @@

  • - .commented_gem_dependency_block_records(content) ⇒ Object + .collapse_nested_templating_guards(content) ⇒ Object @@ -3373,7 +3628,7 @@

  • - .commented_gem_dependency_blocks(content) ⇒ Object + .collect_changelog_list_item(lines, start_index) ⇒ Object @@ -3396,7 +3651,7 @@

  • - .commented_gem_dependency_records(content) ⇒ Object + .collect_yaml_mapping_path_entries(node, path, entries) ⇒ Object @@ -3419,7 +3674,7 @@

  • - .compact_hash(hash) ⇒ Object + .collect_yaml_scalar_path_entries(node, path, entries) ⇒ Object @@ -3442,7 +3697,7 @@

  • - .concrete_github_url(url) ⇒ Object + .commented_gem_call(comment_source) ⇒ Object @@ -3465,7 +3720,7 @@

  • - .config_min_ruby(config) ⇒ Object + .commented_gem_dependency_block_records(content) ⇒ Object @@ -3488,7 +3743,7 @@

  • - .config_test_min_ruby(config, gem_min_ruby = nil) ⇒ Object + .commented_gem_dependency_blocks(content) ⇒ Object @@ -3511,7 +3766,7 @@

  • - .configured_readme_top_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object + .commented_gem_dependency_records(content) ⇒ Object @@ -3534,7 +3789,7 @@

  • - .content_recipe_execution_report(request:, final_content:, changed:, step_reports:, diagnostics:, metadata: nil) ⇒ Object + .compact_hash(hash) ⇒ Object @@ -3557,7 +3812,7 @@

  • - .content_recipe_execution_report_envelope(report) ⇒ Object + .concrete_github_url(url) ⇒ Object @@ -3580,7 +3835,7 @@

  • - .content_recipe_execution_request(recipe_name:, recipe_version:, relative_path:, provider_family:, template_content:, destination_content:, steps:, provider_backend: nil, runtime_context: nil, metadata: nil) ⇒ Object + .config_min_ruby(config) ⇒ Object @@ -3603,7 +3858,7 @@

  • - .content_recipe_execution_request_envelope(request) ⇒ Object + .config_test_min_ruby(config, gem_min_ruby = nil) ⇒ Object @@ -3626,7 +3881,7 @@

  • - .content_recipe_step(recipe) ⇒ Object + .configured_disabled_integrations(config) ⇒ Object @@ -3649,7 +3904,7 @@

  • - .content_recipe_step_report(recipe:, request:, original:, final:, changed:, deletion: nil) ⇒ Object + .configured_readme_top_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object @@ -3672,7 +3927,7 @@

  • - .copy_only_when_missing_template_path?(relative_path) ⇒ Boolean + .content_recipe_execution_report(request:, final_content:, changed:, step_reports:, diagnostics:, metadata: nil) ⇒ Object @@ -3695,7 +3950,7 @@

  • - .copyright_author_names(copyright) ⇒ Object + .content_recipe_execution_report_envelope(report) ⇒ Object @@ -3718,7 +3973,7 @@

  • - .copyright_bot_entry?(entry) ⇒ Boolean + .content_recipe_execution_request(recipe_name:, recipe_version:, relative_path:, provider_family:, template_content:, destination_content:, steps:, provider_backend: nil, runtime_context: nil, metadata: nil) ⇒ Object @@ -3741,7 +3996,7 @@

  • - .copyright_facts(project_root, config) ⇒ Object + .content_recipe_execution_request_envelope(request) ⇒ Object @@ -3764,7 +4019,7 @@

  • - .copyright_machine_user_entry?(entry, machine_users) ⇒ Boolean + .content_recipe_step(recipe) ⇒ Object @@ -3787,7 +4042,7 @@

  • - .copyright_machine_users(config) ⇒ Object + .content_recipe_step_report(recipe:, request:, original:, final:, changed:, deletion: nil) ⇒ Object @@ -3810,7 +4065,7 @@

  • - .copyright_name_from_line(line) ⇒ Object + .copy_only_when_missing_template_path?(relative_path) ⇒ Boolean @@ -3833,7 +4088,7 @@

  • - .copyright_notice_lines(copyright_lines, copyright_prefix, author) ⇒ Object + .copyright_author_names(copyright) ⇒ Object @@ -3856,7 +4111,7 @@

  • - .copyright_year_token?(token) ⇒ Boolean + .copyright_bot_entry?(entry) ⇒ Boolean @@ -3879,7 +4134,7 @@

  • - .coverage_thresholds_from_mise(content) ⇒ Object + .copyright_facts(project_root, config) ⇒ Object @@ -3902,7 +4157,7 @@

  • - .coverage_thresholds_from_project_mise(project_root) ⇒ Object + .copyright_machine_user_entry?(entry, machine_users) ⇒ Boolean @@ -3925,7 +4180,7 @@

  • - .coverage_thresholds_from_workflow(project_root) ⇒ Object + .copyright_machine_users(config) ⇒ Object @@ -3948,7 +4203,7 @@

  • - .coverage_thresholds_from_yaml_workflow(content) ⇒ Object + .copyright_name_from_line(line) ⇒ Object @@ -3971,7 +4226,7 @@

  • - .current_changelog_version_section(content, version) ⇒ Object + .copyright_notice_lines(copyright_lines, copyright_prefix, author) ⇒ Object @@ -3994,7 +4249,7 @@

  • - .decision_policy_for(env, run_options) ⇒ Object + .copyright_year_token?(token) ⇒ Boolean @@ -4017,7 +4272,7 @@

  • - .decorative_grapheme?(grapheme) ⇒ Boolean + .coverage_thresholds_from_mise(content) ⇒ Object @@ -4040,7 +4295,7 @@

  • - .deduplicate_readme_top_logo_entries(entries) ⇒ Object + .coverage_thresholds_from_project_mise(project_root) ⇒ Object @@ -4063,7 +4318,7 @@

  • - .deep_dup(value) ⇒ Object + .coverage_thresholds_from_workflow(project_root) ⇒ Object @@ -4086,7 +4341,7 @@

  • - .deep_string_key_hash(value) ⇒ Object + .coverage_thresholds_from_yaml_workflow(content) ⇒ Object @@ -4109,7 +4364,7 @@

  • - .default_framework_matrix_requirement(version) ⇒ Object + .current_changelog_version_section(content, version) ⇒ Object @@ -4132,7 +4387,7 @@

  • - .default_readme_top_logo_credit(type) ⇒ Object + .decision_policy_for(env, run_options) ⇒ Object @@ -4155,7 +4410,7 @@

  • - .default_readme_top_logo_href(type, slug:, org:, gem_name:, repository: {}) ⇒ Object + .decorative_grapheme?(grapheme) ⇒ Boolean @@ -4178,7 +4433,7 @@

  • - .default_readme_top_logo_slug(type, org:, gem_name:, repository: {}) ⇒ Object + .deduplicate_main_gemfile_direct_sibling_blocks(content) ⇒ Object @@ -4201,7 +4456,7 @@

  • - .default_template_config ⇒ Object + .deduplicate_readme_top_logo_entries(entries) ⇒ Object @@ -4224,7 +4479,7 @@

  • - .default_template_strategy_config(template_root, target_path) ⇒ Object + .deep_dup(value) ⇒ Object @@ -4247,7 +4502,7 @@

  • - .delete_file_recipe?(recipe) ⇒ Boolean + .deep_string_key_hash(value) ⇒ Object @@ -4270,7 +4525,7 @@

  • - .delete_line_ranges(content, selectors) ⇒ Object + .default_framework_matrix_requirement(version) ⇒ Object @@ -4293,7 +4548,7 @@

  • - .delete_markdown_with_ast_crispr(content, target) ⇒ Object + .default_readme_top_logo_credit(type) ⇒ Object @@ -4316,7 +4571,7 @@

  • - .delete_rakefile_scaffold(content) ⇒ Object + .default_readme_top_logo_href(type, slug:, org:, gem_name:, repository: {}) ⇒ Object @@ -4339,7 +4594,7 @@

  • - .detected_license_ids(project_root) ⇒ Object + .default_readme_top_logo_slug(type, org:, gem_name:, repository: {}) ⇒ Object @@ -4362,7 +4617,7 @@

  • - .discover_facts(project_root, env: ENV, run_options: {}) ⇒ Object + .default_template_config ⇒ Object @@ -4385,7 +4640,7 @@

  • - .discover_monorepo_root_facts(project_root, kettle_config, env, template_selection) ⇒ Object + .default_template_strategy_config(template_root, target_path) ⇒ Object @@ -4408,7 +4663,7 @@

  • - .display_path(path) ⇒ Object + .delete_file_recipe?(recipe) ⇒ Boolean @@ -4431,7 +4686,7 @@

  • - .display_text(text) ⇒ Object + .delete_line_ranges(content, selectors) ⇒ Object @@ -4454,7 +4709,7 @@

  • - .dotenv_merge_options(recipe) ⇒ Object + .delete_markdown_with_ast_crispr(content, target) ⇒ Object @@ -4477,7 +4732,7 @@

  • - .duplicate_drift_report(project_root:, template_root:, run_options: {}) ⇒ Object + .delete_project_file(project_root, relative_path) ⇒ Object @@ -4500,7 +4755,7 @@

  • - .enabled_ruby_engines(config) ⇒ Object + .delete_rakefile_scaffold(content) ⇒ Object @@ -4523,7 +4778,7 @@

  • - .enforce_git_preflight!(git_preflight, decision_policy:, template_selection:) ⇒ Object + .detected_license_ids(project_root) ⇒ Object @@ -4546,7 +4801,7 @@

  • - .ensure_gemspec_legacy_version_loader_preamble(content, entrypoint_require:, namespace:, min_ruby:) ⇒ Object + .direct_sibling_directory_defines_gem?(sibling_path, gem_name) ⇒ Boolean @@ -4569,7 +4824,7 @@

  • - .ensure_monorepo_root_gemfile_dependencies(content) ⇒ Object + .direct_sibling_runtime_gems(project_root, gemspec_metadata, package_name:, local_modular_eval_paths: {}) ⇒ Object @@ -4592,7 +4847,7 @@

  • - .ensure_trailing_newline(text) ⇒ Object + .direct_sibling_workspace_slug(source_url, project_root) ⇒ Object @@ -4615,7 +4870,7 @@

  • - .ensure_workflow_top_level_section(content, key, section, before:) ⇒ Object + .disabled_coverage_integrations(config) ⇒ Object @@ -4638,7 +4893,7 @@

  • - .env_overridden_gemspec_fields(env) ⇒ Object + .disabled_integration_config_cleanups(project_root, config) ⇒ Object @@ -4661,7 +4916,7 @@

  • - .execute_recipe(project_root:, recipe:, facts:, files:, decision_policy:, env: ENV) ⇒ Object + .disabled_integration_template_path?(target_path, config) ⇒ Boolean @@ -4684,7 +4939,7 @@

  • - .existing_entrypoint_version_namespace(project_root, relative_path) ⇒ Object + .disabled_integrations(config, license: nil) ⇒ Object @@ -4707,7 +4962,7 @@

  • - .existing_version_file_value(project_root, relative_path) ⇒ Object + .discover_facts(project_root, env: ENV, run_options: {}) ⇒ Object @@ -4730,7 +4985,7 @@

  • - .existing_version_namespace(project_root, relative_path) ⇒ Object + .discover_monorepo_root_facts(project_root, kettle_config, env, template_selection) ⇒ Object @@ -4753,7 +5008,7 @@

  • - .expand_framework_gemfile_pattern(pattern, version) ⇒ Object + .display_path(path) ⇒ Object @@ -4767,7 +5022,7 @@

    -
    +

    rubocop:enable ThreadSafety/ClassInstanceVariable.

  • @@ -4776,7 +5031,7 @@

  • - .expand_line_range_through_following_blanks(content, end_line) ⇒ Object + .display_text(text) ⇒ Object @@ -4799,7 +5054,7 @@

  • - .explicit_zero_runtime_floor?(facts) ⇒ Boolean + .dotenv_merge_options(recipe) ⇒ Object @@ -4822,7 +5077,7 @@

  • - .extract_gemspec_development_dependencies(gemspec) ⇒ Object + .duplicate_drift_report(project_root:, template_root:, run_options: {}) ⇒ Object @@ -4845,7 +5100,7 @@

  • - .fallback_adapter_failure_template_source(file_type, recipe, template_content, destination_content, facts) ⇒ Object + .emit_diagnostic_events(events, diagnostics) ⇒ Object @@ -4868,7 +5123,7 @@

  • - .falsey_config?(value) ⇒ Boolean + .emit_event(events, type, payload = {}) ⇒ Object @@ -4891,7 +5146,7 @@

  • - .filter_recipe_pack(pack, template_selection) ⇒ Object + .emit_phase_event(events, phase, status:, **payload) ⇒ Object @@ -4914,7 +5169,7 @@

  • - .finalize_accepted_template_source(recipe, content, destination_content, facts:, project_root: nil) ⇒ Object + .emit_recipe_event(events, report, index:, total:) ⇒ Object @@ -4937,7 +5192,7 @@

  • - .finalize_gemfile_template_source(recipe, content, destination_content, facts:, template_content:) ⇒ Object + .emit_step_event(events, event_type, step, phase:, index: nil, total: nil) ⇒ Object @@ -4960,7 +5215,7 @@

  • - .finalize_github_workflow_template(content, facts = nil) ⇒ Object + .emit_step_events(events, event_type, steps, phase:) ⇒ Object @@ -4983,7 +5238,7 @@

  • - .finalize_rubocop_config(content) ⇒ Object + .emit_summary_event(events, report) ⇒ Object @@ -5006,7 +5261,7 @@

  • - .finalize_template_source_content(recipe, content) ⇒ Object + .empty_gemspec_development_dependency_section_matches(lines, heading_line_indexes:, dependency_line_indexes:) ⇒ Object @@ -5029,7 +5284,7 @@

  • - .first_grapheme(text) ⇒ Object + .empty_gemspec_development_dependency_sections_target(receiver:) ⇒ Object @@ -5052,7 +5307,7 @@

  • - .forge_facts(config, env, derived_github_user: nil) ⇒ Object + .enabled_ruby_engines(config) ⇒ Object @@ -5075,7 +5330,7 @@

  • - .forge_template_tokens(forge) ⇒ Object + .enforce_gemspec_dependency_minimum_requirements(source, receiver:) ⇒ Object @@ -5098,7 +5353,7 @@

  • - .forge_user_value(forge_config, env, key, derived_value: nil) ⇒ Object + .enforce_git_preflight!(git_preflight, decision_policy:, template_selection:) ⇒ Object @@ -5121,7 +5376,7 @@

  • - .format_copyright_years(years) ⇒ Object + .ensure_gemspec_legacy_version_loader_preamble(content, entrypoint_require:, namespace:, min_ruby:) ⇒ Object @@ -5144,7 +5399,7 @@

  • - .framework_gemfile_path(gemfile) ⇒ Object + .ensure_main_gemfile_nomono_bootstrap(content, template_content) ⇒ Object @@ -5167,7 +5422,7 @@

  • - .framework_matrix_appraisal_block(entry) ⇒ Object + .ensure_monorepo_root_gemfile_dependencies(content) ⇒ Object @@ -5190,7 +5445,7 @@

  • - .framework_matrix_appraisal_dependency_gemfiles(facts) ⇒ Object + .ensure_runtime_dependencies! ⇒ Object @@ -5204,7 +5459,7 @@

    -
    +

    rubocop:disable ThreadSafety/ClassInstanceVariable.

  • @@ -5213,7 +5468,7 @@

  • - .framework_matrix_appraisal_env_by_name(facts) ⇒ Object + .ensure_spec_helper_simplecov_config_require(content) ⇒ Object @@ -5236,7 +5491,7 @@

  • - .framework_matrix_appraisal_gemfile_path(path) ⇒ Object + .ensure_spec_helper_simplecov_do_cov_bootstrap(content) ⇒ Object @@ -5259,7 +5514,7 @@

  • - .framework_matrix_appraisal_gemfiles(raw) ⇒ Object + .ensure_spec_helper_simplecov_start(content) ⇒ Object @@ -5282,7 +5537,7 @@

  • - .framework_matrix_appraisal_name(dimension, slug) ⇒ Object + .ensure_trailing_newline(text) ⇒ Object @@ -5305,7 +5560,7 @@

  • - .framework_matrix_env(raw) ⇒ Object + .ensure_workflow_top_level_section(content, key, section, before:) ⇒ Object @@ -5328,7 +5583,7 @@

  • - .framework_matrix_replaced_appraisal_names(dimension, entry, name) ⇒ Object + .ensure_yaml_top_level_sequence_items(content, key, items) ⇒ Object @@ -5351,7 +5606,7 @@

  • - .framework_matrix_version_entry(raw) ⇒ Object + .env_overridden_gemspec_fields(env) ⇒ Object @@ -5374,7 +5629,7 @@

  • - .framework_matrix_workflow_enabled?(raw) ⇒ Boolean + .env_sync_value(env, env_key) ⇒ Object @@ -5397,7 +5652,7 @@

  • - .freeze_marker_blocks(content, freeze_token: nil) ⇒ Object + .event_payload_value(payload, key) ⇒ Object @@ -5420,7 +5675,7 @@

  • - .funding_platform_token_facts(config, env) ⇒ Object + .event_stream(io, types: nil) ⇒ Object @@ -5443,7 +5698,7 @@

  • - .funding_platform_token_value(funding_config, env, key) ⇒ Object + .event_stream_from_options(run_options) ⇒ Object @@ -5466,7 +5721,7 @@

  • - .funding_template_tokens(funding) ⇒ Object + .execute_recipe(project_root:, recipe:, facts:, files:, decision_policy:, env: ENV) ⇒ Object @@ -5489,7 +5744,7 @@

  • - .funding_urls(project_root, package_name, funding_uri: nil, opencollective_disabled: false, open_collective_org: nil) ⇒ Object + .existing_entrypoint_version_namespace(project_root, relative_path) ⇒ Object @@ -5512,7 +5767,7 @@

  • - .gem_major_token(version) ⇒ Object + .existing_version_file_value(project_root, relative_path) ⇒ Object @@ -5535,7 +5790,7 @@

  • - .gemfile_comment_line?(line) ⇒ Boolean + .existing_version_namespace(project_root, relative_path) ⇒ Object @@ -5558,7 +5813,7 @@

  • - .gemfile_declares_gem?(content, gem_name) ⇒ Boolean + .expand_framework_gemfile_pattern(pattern, version) ⇒ Object @@ -5581,7 +5836,7 @@

  • - .gemfile_dependency_insertion_line(content) ⇒ Object + .expand_line_range_through_following_blanks(content, end_line) ⇒ Object @@ -5604,7 +5859,7 @@

  • - .gemfile_dependency_names(content) ⇒ Object + .explicit_integration_enabled?(config, integration) ⇒ Boolean @@ -5627,7 +5882,7 @@

  • - .gemfile_dependency_statement?(node) ⇒ Boolean + .explicit_zero_runtime_floor?(facts) ⇒ Boolean @@ -5650,7 +5905,7 @@

  • - .gemfile_eval_bucket_entries(content) ⇒ Object + .extract_gemspec_development_dependencies(gemspec) ⇒ Object @@ -5673,7 +5928,7 @@

  • - .gemfile_gem_call_records(content) ⇒ Object + .fallback_opencollective_org ⇒ Object @@ -5696,7 +5951,7 @@

  • - .gemfile_paragraphs(content) ⇒ Object + .falsey_config?(value) ⇒ Boolean @@ -5719,7 +5974,7 @@

  • - .gemfile_percent_w_names(content) ⇒ Object + .filter_recipe_pack(pack, template_selection) ⇒ Object @@ -5742,7 +5997,7 @@

  • - .gemfile_policy_operations(template_content, original, final, request) ⇒ Object + .finalize_accepted_template_source(recipe, content, destination_content, facts:, project_root: nil) ⇒ Object @@ -5765,7 +6020,7 @@

  • - .gemspec_assignment_end_line(call) ⇒ Object + .finalize_gemfile_template_source(recipe, content, destination_content, facts:, template_content:) ⇒ Object @@ -5788,7 +6043,7 @@

  • - .gemspec_assignment_field(call) ⇒ Object + .finalize_github_workflow_template(content, facts = nil) ⇒ Object @@ -5811,7 +6066,7 @@

  • - .gemspec_assignment_records(source, receiver: nil) ⇒ Object + .finalize_rubocop_config(content) ⇒ Object @@ -5834,7 +6089,7 @@

  • - .gemspec_assignment_value(call) ⇒ Object + .finalize_template_source_content(recipe, content) ⇒ Object @@ -5857,7 +6112,7 @@

  • - .gemspec_block_param(source) ⇒ Object + .first_grapheme(text) ⇒ Object @@ -5880,7 +6135,7 @@

  • - .gemspec_dependency_call_kind(call) ⇒ Object + .forge_facts(config, env, derived_github_user: nil) ⇒ Object @@ -5903,7 +6158,7 @@

  • - .gemspec_dependency_from_record(record) ⇒ Object + .forge_template_tokens(forge) ⇒ Object @@ -5926,7 +6181,7 @@

  • - .gemspec_dependency_line_index(source, receiver:) ⇒ Object + .forge_user_value(forge_config, env, key, derived_value: nil) ⇒ Object @@ -5949,7 +6204,7 @@

  • - .gemspec_dependency_line_key(line, receiver:) ⇒ Object + .format_copyright_years(years) ⇒ Object @@ -5972,7 +6227,7 @@

  • - .gemspec_dependency_names(source) ⇒ Object + .framework_gemfile_path(gemfile) ⇒ Object @@ -5995,7 +6250,7 @@

  • - .gemspec_dependency_record_key(record) ⇒ Object + .framework_matrix_appraisal_block(entry) ⇒ Object @@ -6018,7 +6273,7 @@

  • - .gemspec_dependency_record_version(record) ⇒ Object + .framework_matrix_appraisal_dependency_gemfiles(facts) ⇒ Object @@ -6041,7 +6296,7 @@

  • - .gemspec_dependency_records(source, receiver: nil) ⇒ Object + .framework_matrix_appraisal_env_by_name(facts) ⇒ Object @@ -6064,7 +6319,7 @@

  • - .gemspec_dependency_sort_key(name) ⇒ Object + .framework_matrix_appraisal_gemfile_path(path) ⇒ Object @@ -6087,7 +6342,7 @@

  • - .gemspec_dependency_source_newer?(candidate_source, current_source, receiver:) ⇒ Boolean + .framework_matrix_appraisal_gemfiles(raw) ⇒ Object @@ -6110,7 +6365,7 @@

  • - .gemspec_end_line(source) ⇒ Object + .framework_matrix_appraisal_name(dimension, slug) ⇒ Object @@ -6133,7 +6388,7 @@

  • - .gemspec_field_receiver_and_name(field) ⇒ Object + .framework_matrix_env(raw) ⇒ Object @@ -6156,7 +6411,7 @@

  • - .gemspec_legacy_version_loader_block(entrypoint_require:, namespace:, min_ruby:) ⇒ Object + .framework_matrix_replaced_appraisal_names(dimension, entry, name) ⇒ Object @@ -6179,7 +6434,7 @@

  • - .gemspec_legacy_version_loader_preamble_line_range(content) ⇒ Object + .framework_matrix_version_entry(raw) ⇒ Object @@ -6202,7 +6457,7 @@

  • - .gemspec_modern_version_loader_expression(entrypoint_require:, namespace:) ⇒ Object + .framework_matrix_workflow_enabled?(raw) ⇒ Boolean @@ -6225,7 +6480,7 @@

  • - .gemspec_new_call(source) ⇒ Object + .freeze_marker_blocks(content, freeze_token: nil) ⇒ Object @@ -6248,7 +6503,7 @@

  • - .gemspec_path_declares_gem?(path, gem_name) ⇒ Boolean + .funding_platform_token_facts(config, env) ⇒ Object @@ -6271,7 +6526,7 @@

  • - .gemspec_policy_operations(template_content, original, final, request) ⇒ Object + .funding_platform_token_value(funding_config, env, key) ⇒ Object @@ -6294,7 +6549,7 @@

  • - .gemspec_preserved_assignments(source, receiver:) ⇒ Object + .funding_template_tokens(funding) ⇒ Object @@ -6317,7 +6572,7 @@

  • - .gemspec_project_emoji(gemspec_metadata) ⇒ Object + .funding_urls(project_root, package_name, funding_uri: nil, opencollective_disabled: false, open_collective_org: nil) ⇒ Object @@ -6340,7 +6595,7 @@

  • - .gemspec_runtime_floor_token(facts) ⇒ Object + .gem_major_token(version) ⇒ Object @@ -6363,7 +6618,7 @@

  • - .gemspec_self_dependency_names(request, package_name) ⇒ Object + .gemfile_comment_line?(line) ⇒ Boolean @@ -6386,7 +6641,7 @@

  • - .gemspec_top_level_gem_version_node(content) ⇒ Object + .gemfile_conditional_node?(node) ⇒ Boolean @@ -6409,7 +6664,7 @@

  • - .gemspec_version_loader_policy_operation(original, final, request) ⇒ Object + .gemfile_declares_gem?(content, gem_name) ⇒ Boolean @@ -6432,7 +6687,7 @@

  • - .generated_blocks_facts(gemspec, facts, run_options) ⇒ Object + .gemfile_dependency_insertion_line(content) ⇒ Object @@ -6455,7 +6710,7 @@

  • - .generated_kettle_config_without_templates?(config) ⇒ Boolean + .gemfile_dependency_names(content) ⇒ Object @@ -6478,7 +6733,7 @@

  • - .generated_or_obsolete_github_workflow?(relative_path) ⇒ Boolean + .gemfile_dependency_statement?(node) ⇒ Boolean @@ -6501,7 +6756,7 @@

  • - .generated_version_tree_source_url?(source_url, version) ⇒ Boolean + .gemfile_eval_bucket_entries(content) ⇒ Object @@ -6524,7 +6779,7 @@

  • - .git_capture(project_root, *args) ⇒ Object + .gemfile_eval_comment_start_line(lines, start_line) ⇒ Object @@ -6547,7 +6802,7 @@

  • - .git_copyright_lines(project_root, machine_users) ⇒ Object + .gemfile_eval_paths(content) ⇒ Object @@ -6570,7 +6825,7 @@

  • - .git_output(project_root, *args) ⇒ Object + .gemfile_gem_call_records(content) ⇒ Object @@ -6593,7 +6848,7 @@

  • - .git_preflight_report(project_root, template_selection:) ⇒ Object + .gemfile_nomono_dependency_names(content) ⇒ Object @@ -6616,7 +6871,7 @@

  • - .git_remote_source_url(project_root) ⇒ Object + .gemfile_paragraphs(content) ⇒ Object @@ -6639,7 +6894,7 @@

  • - .git_success?(project_root, *args) ⇒ Boolean + .gemfile_percent_w_names(content) ⇒ Object @@ -6662,7 +6917,7 @@

  • - .git_worktree_prefix(project_root) ⇒ Object + .gemfile_policy_operations(template_content, original, final, request) ⇒ Object @@ -6685,7 +6940,7 @@

  • - .git_worktree_root(project_root) ⇒ Object + .gemfile_workspace_override_node?(node) ⇒ Boolean @@ -6708,7 +6963,7 @@

  • - .github_actions_coverage_config(config, env = ENV) ⇒ Object + .gemspec_assignment_field(call) ⇒ Object @@ -6731,7 +6986,7 @@

  • - .github_actions_coverage_enabled?(content) ⇒ Boolean + .gemspec_assignment_records(source, receiver: nil) ⇒ Object @@ -6754,7 +7009,7 @@

  • - .github_actions_coverage_steps ⇒ Object + .gemspec_assignment_value(call) ⇒ Object @@ -6777,7 +7032,7 @@

  • - .github_actions_custom_workflows(project_root, config = {}, opencollective_disabled: false) ⇒ Object + .gemspec_block_param(source) ⇒ Object @@ -6800,7 +7055,7 @@

  • - .github_actions_exec_cmd(config, env) ⇒ Object + .gemspec_dependency_call_kind(call) ⇒ Object @@ -6823,7 +7078,7 @@

  • - .github_actions_framework_matrix(config) ⇒ Object + .gemspec_dependency_from_record(record) ⇒ Object @@ -6846,7 +7101,7 @@

  • - .github_actions_obsolete_workflows(project_root) ⇒ Object + .gemspec_dependency_line_index(source, receiver:) ⇒ Object @@ -6869,7 +7124,7 @@

  • - .github_actions_ruby_versions(min_ruby) ⇒ Object + .gemspec_dependency_line_key(line, receiver:) ⇒ Object @@ -6892,7 +7147,7 @@

  • - .github_actions_standard_appraisal_gemfiles(config) ⇒ Object + .gemspec_dependency_minimum_requirement_replacement(call, requirement) ⇒ Object @@ -6915,7 +7170,7 @@

  • - .github_actions_step_pins ⇒ Object + .gemspec_dependency_names(source) ⇒ Object @@ -6938,7 +7193,7 @@

  • - .github_funding_platform_urls(platform, values) ⇒ Object + .gemspec_dependency_record_key(record) ⇒ Object @@ -6961,7 +7216,7 @@

  • - .github_funding_urls(path, opencollective_disabled: false) ⇒ Object + .gemspec_dependency_record_version(record) ⇒ Object @@ -6984,7 +7239,7 @@

  • - .github_org_from_url(url) ⇒ Object + .gemspec_dependency_records(source, receiver: nil) ⇒ Object @@ -7007,7 +7262,7 @@

  • - .github_workflow_template_recipe?(recipe) ⇒ Boolean + .gemspec_dependency_requirements_satisfy_floor?(requirements, floor_requirement) ⇒ Boolean @@ -7030,7 +7285,7 @@

  • - .github_workflows_include?(project_root, needle) ⇒ Boolean + .gemspec_dependency_section_heading_comment?(stripped_line) ⇒ Boolean @@ -7044,7 +7299,7 @@

    -
    +

    Prism does not expose comments as normal AST statements, so dependency-section headings are bounded to single-line comments after the gemspec development note.

  • @@ -7053,7 +7308,7 @@

  • - .gitlab_repo_url(repository, repo_slug, suffix) ⇒ Object + .gemspec_dependency_sort_key(name) ⇒ Object @@ -7076,7 +7331,7 @@

  • - .html_attribute_escape(value) ⇒ Object + .gemspec_dependency_source_newer?(candidate_source, current_source, receiver:) ⇒ Boolean @@ -7099,7 +7354,7 @@

  • - .http_url?(value) ⇒ Boolean + .gemspec_end_line(source) ⇒ Object @@ -7122,7 +7377,7 @@

  • - .inactive_packaged_template_cleanup_files(project_root, config = {}) ⇒ Object + .gemspec_field_receiver_and_name(field) ⇒ Object @@ -7145,7 +7400,7 @@

  • - .inactive_packaged_workflow?(relative_path, config = {}, include_patterns: nil) ⇒ Boolean + .gemspec_files_array_collection_source(target_parts, groups) ⇒ Object @@ -7168,7 +7423,7 @@

  • - .inactive_packaged_workflow_cleanup_files(project_root, config = {}, include_patterns: nil) ⇒ Object + .gemspec_files_child_collection_record(record, value_node) ⇒ Object @@ -7191,7 +7446,7 @@

  • - .inject_appraisal_gemfiles(block, gemfiles) ⇒ Object + .gemspec_files_collection_body_source(groups) ⇒ Object @@ -7214,7 +7469,7 @@

  • - .inject_framework_matrix_workflow_env(content, facts) ⇒ Object + .gemspec_files_collection_element_nodes(value_node) ⇒ Object @@ -7237,7 +7492,7 @@

  • - .inject_standard_appraisal_gemfiles(content, facts) ⇒ Object + .gemspec_files_collection_entry_key(node) ⇒ Object @@ -7260,7 +7515,7 @@

  • - .insert_after_line_sequence(content, sequence, insertion, error_message) ⇒ Object + .gemspec_files_collection_entry_node?(node) ⇒ Boolean @@ -7283,7 +7538,7 @@

  • - .insert_gemfile_dependency_blocks(content, blocks) ⇒ Object + .gemspec_files_collection_group_source(group, trailing_comma:) ⇒ Object @@ -7306,7 +7561,7 @@

  • - .insert_lines_after(content, line_number, insertion) ⇒ Object + .gemspec_files_collection_groups(record:, element_nodes:, lines:) ⇒ Object @@ -7329,7 +7584,7 @@

  • - .insert_lines_before(content, line_number, insertion) ⇒ Object + .gemspec_files_collection_has_nonliteral_entries?(parts) ⇒ Boolean @@ -7352,7 +7607,7 @@

  • - .insert_missing_development_gemspec_dependency_lines(content, missing_lines) ⇒ Object + .gemspec_files_collection_has_package_metadata_splat?(parts) ⇒ Boolean @@ -7375,7 +7630,7 @@

  • - .insert_missing_runtime_gemspec_dependency_lines(content, missing_lines, receiver:) ⇒ Object + .gemspec_files_collection_kind(value_node) ⇒ Object @@ -7398,7 +7653,7 @@

  • - .insert_yaml_scalar_after_path(content, path, key, value) ⇒ Object + .gemspec_files_collection_needs_concat?(target_parts, groups) ⇒ Boolean @@ -7421,7 +7676,7 @@

  • - .install_tasks ⇒ Object + .gemspec_files_collection_parts(record) ⇒ Object @@ -7444,7 +7699,7 @@

  • - .json_merge_options(recipe) ⇒ Object + .gemspec_files_concat_call_node?(node) ⇒ Boolean @@ -7467,7 +7722,7 @@

  • - .kettle_config_bootstrap_facts(project_root, env, template_selection: {}) ⇒ Object + .gemspec_files_concat_collection_parts(record, value_node) ⇒ Object @@ -7490,7 +7745,7 @@

  • - .kettle_config_bootstrap_recipe(bootstrap) ⇒ Object + .gemspec_files_concat_collection_source(target_parts, groups) ⇒ Object @@ -7513,7 +7768,7 @@

  • - .kettle_config_file_override_lines(path, strategy) ⇒ Object + .gemspec_files_dir_call_node?(node) ⇒ Boolean @@ -7536,7 +7791,7 @@

  • - .kettle_config_template_entries_lines(entries) ⇒ Object + .gemspec_files_dir_collection_source(target_parts, groups, closing: nil) ⇒ Object @@ -7559,7 +7814,7 @@

  • - .kettle_jem_config(project_root) ⇒ Object + .gemspec_files_group_collection_kind(group, parts) ⇒ Object @@ -7582,7 +7837,7 @@

  • - .kettle_jem_config_path(project_root) ⇒ Object + .gemspec_files_single_collection_parts(record, value_node) ⇒ Object @@ -7605,7 +7860,7 @@

  • - .kettle_jem_config_relative_path(project_root) ⇒ Object + .gemspec_files_splat_expression_key(node) ⇒ Object @@ -7628,7 +7883,7 @@

  • - .kettle_rb_local_gems(config) ⇒ Object + .gemspec_freeze_block_structurally_managed?(block, receiver:) ⇒ Boolean @@ -7651,7 +7906,7 @@

  • - .known_license_template_basenames ⇒ Object + .gemspec_legacy_version_loader_block(entrypoint_require:, namespace:, min_ruby:) ⇒ Object @@ -7674,7 +7929,7 @@

  • - .large_business_license_cell(author_email) ⇒ Object + .gemspec_legacy_version_loader_preamble_line_range(content) ⇒ Object @@ -7697,7 +7952,7 @@

  • - .leading_whitespace(source) ⇒ Object + .gemspec_modern_version_loader_expression(entrypoint_require:, namespace:) ⇒ Object @@ -7720,7 +7975,7 @@

  • - .license_badge(spdx_id, ref: :license_ref) ⇒ Object + .gemspec_new_call(source) ⇒ Object @@ -7743,7 +7998,7 @@

  • - .license_badge_img(spdx_id) ⇒ Object + .gemspec_package_file_includes_token(gemspec) ⇒ Object @@ -7766,7 +8021,7 @@

  • - .license_badge_ref(spdx_id) ⇒ Object + .gemspec_path_declares_gem?(path, gem_name) ⇒ Boolean @@ -7789,7 +8044,7 @@

  • - .license_compat_badge(category) ⇒ Object + .gemspec_policy_operations(template_content, original, final, request) ⇒ Object @@ -7812,7 +8067,7 @@

  • - .license_compat_category(licenses) ⇒ Object + .gemspec_preserved_assignment_fields ⇒ Object @@ -7835,7 +8090,7 @@

  • - .license_compat_img(category) ⇒ Object + .gemspec_preserved_assignments(source, receiver:) ⇒ Object @@ -7858,7 +8113,7 @@

  • - .license_compat_ref(category) ⇒ Object + .gemspec_project_emoji(gemspec_metadata) ⇒ Object @@ -7881,7 +8136,7 @@

  • - .license_contact_line(author_email, context:) ⇒ Object + .gemspec_root_license_files_token(license) ⇒ Object @@ -7904,7 +8159,7 @@

  • - .license_copyright_notice(copyright_lines, copyright_prefix, author) ⇒ Object + .gemspec_runtime_dependency_names(gemspec_metadata) ⇒ Object @@ -7927,7 +8182,7 @@

  • - .license_eye_dependency_license_entry(entry) ⇒ Object + .gemspec_runtime_floor_token(facts) ⇒ Object @@ -7950,7 +8205,7 @@

  • - .license_eye_dependency_licenses(config) ⇒ Object + .gemspec_self_dependency_names(request, package_name) ⇒ Object @@ -7973,7 +8228,7 @@

  • - .license_eye_flags(licenses) ⇒ Object + .gemspec_template_facts(config) ⇒ Object @@ -7996,7 +8251,7 @@

  • - .license_eye_mode(licenses) ⇒ Object + .gemspec_template_tokens(gemspec) ⇒ Object @@ -8019,7 +8274,7 @@

  • - .license_eye_primary_spdx(licenses, fallback) ⇒ Object + .gemspec_top_level_gem_version_node(content) ⇒ Object @@ -8042,7 +8297,7 @@

  • - .license_eye_workflow_badge(licenses) ⇒ Object + .gemspec_version_loader_policy_operation(original, final, request) ⇒ Object @@ -8065,7 +8320,7 @@

  • - .license_facts(config, gemspec_licenses, author: {}, author_email: nil, copyright: {}) ⇒ Object + .generated_blocks_facts(gemspec, facts, run_options) ⇒ Object @@ -8088,7 +8343,7 @@

  • - .license_link(spdx_id) ⇒ Object + .generated_gemspec_metadata_file_group?(group, target_parts) ⇒ Boolean @@ -8111,7 +8366,7 @@

  • - .license_md_content(licenses, author_email: nil) ⇒ Object + .generated_kettle_config_without_templates?(config) ⇒ Boolean @@ -8134,7 +8389,7 @@

  • - .license_template_tokens(license) ⇒ Object + .generated_or_obsolete_github_workflow?(relative_path) ⇒ Boolean @@ -8157,7 +8412,7 @@

  • - .license_use_case_guide_table(licenses, author_email: nil) ⇒ Object + .generated_version_tree_source_url?(source_url, version) ⇒ Boolean @@ -8180,7 +8435,7 @@

  • - .license_use_case_rows(licenses, author_email: nil) ⇒ Object + .generic_bundler_gemspec_files_assignment?(record) ⇒ Boolean @@ -8203,7 +8458,7 @@

  • - .load_project_gemspec(gemspec_path) ⇒ Object + .generic_bundler_gemspec_files_command?(node) ⇒ Boolean @@ -8226,7 +8481,7 @@

  • - .local_gemfile_template_recipe?(recipe) ⇒ Boolean + .git_capture(project_root, *args) ⇒ Object @@ -8249,7 +8504,7 @@

  • - .local_gems_assignment(content) ⇒ Object + .git_copyright_lines(project_root, machine_users) ⇒ Object @@ -8272,7 +8527,7 @@

  • - .local_gems_assignment_record(content) ⇒ Object + .git_hooks_executable_step(project_root) ⇒ Object @@ -8295,7 +8550,7 @@

  • - .managed_license_template_basename(target_path) ⇒ Object + .git_output(project_root, *args) ⇒ Object @@ -8318,7 +8573,7 @@

  • - .markdown_heading_has_preserved_readme_ancestor?(heading_sections, index) ⇒ Boolean + .git_preflight_report(project_root, template_selection:) ⇒ Object @@ -8341,7 +8596,7 @@

  • - .markdown_heading_owners(content, source_label: "README.md") ⇒ Object + .git_remote_source_url(project_root) ⇒ Object @@ -8364,7 +8619,7 @@

  • - .markdown_link_definition_source(owner, url) ⇒ Object + .git_success?(project_root, *args) ⇒ Boolean @@ -8387,7 +8642,7 @@

  • - .markdown_link_reference_definition_line?(line) ⇒ Boolean + .git_version_file_value(project_root, relative_path) ⇒ Object @@ -8410,7 +8665,7 @@

  • - .markdown_managed_block(content, marker) ⇒ Object + .git_worktree_prefix(project_root) ⇒ Object @@ -8433,7 +8688,7 @@

  • - .markdown_sections(content) ⇒ Object + .git_worktree_root(project_root) ⇒ Object @@ -8456,7 +8711,7 @@

  • - .markdown_source_lines(content) ⇒ Object + .github_actions_coverage_config(config, env = ENV) ⇒ Object @@ -8479,7 +8734,7 @@

  • - .merge_appraisal_blocks_with_prism(template_block, destination_block) ⇒ Object + .github_actions_coverage_enabled?(content) ⇒ Boolean @@ -8502,7 +8757,7 @@

  • - .merge_appraisals_template_policy(content, facts:) ⇒ Object + .github_actions_coverage_steps(disabled_integrations: []) ⇒ Object @@ -8525,7 +8780,7 @@

  • - .merge_bash_template_source(template_content, destination_content, recipe) ⇒ Object + .github_actions_custom_workflows(project_root, config = {}, opencollective_disabled: false) ⇒ Object @@ -8548,7 +8803,7 @@

  • - .merge_changelog_template_source(template_content, destination_content) ⇒ Object + .github_actions_exec_cmd(config, env) ⇒ Object @@ -8571,7 +8826,7 @@

  • - .merge_config_template_source(recipe, template_content, destination_content, facts: nil, env: ENV) ⇒ Object + .github_actions_framework_matrix(config) ⇒ Object @@ -8594,7 +8849,7 @@

  • - .merge_dotenv_template_source(template_content, destination_content, recipe) ⇒ Object + .github_actions_obsolete_workflows(project_root) ⇒ Object @@ -8617,7 +8872,7 @@

  • - .merge_framework_matrix_appraisals(content, facts) ⇒ Object + .github_actions_pin_sync_step(project_root) ⇒ Object @@ -8640,7 +8895,7 @@

  • - .merge_gemfile_eval_bucket_entries(template_content, merged_content) ⇒ Object + .github_actions_push_branches(content, default_branch:) ⇒ Object @@ -8663,7 +8918,7 @@

  • - .merge_gemfile_template_policy(content, facts:, template_content: nil, preserve_self_word_entries: false) ⇒ Object + .github_actions_push_branches_yaml(content, default_branch:, indent: " ") ⇒ Object @@ -8686,7 +8941,7 @@

  • - .merge_gemspec_template_source(template_content, destination_content, facts: nil, env: ENV) ⇒ Object + .github_actions_rspec_status_cache_step(cache_scope:, key_parts:, indent:, if_condition: "${{!env.ACT}}") ⇒ Object @@ -8709,7 +8964,7 @@

  • - .merge_json_template_source(template_content, destination_content, recipe, file_type) ⇒ Object + .github_actions_ruby_versions(min_ruby) ⇒ Object @@ -8732,7 +8987,7 @@

  • - .merge_local_gem_overrides(content, destination_content, facts:, template_content: nil) ⇒ Object + .github_actions_setup_ruby_steps(indent:) ⇒ Object @@ -8755,7 +9010,7 @@

  • - .merge_prism_gemfile_template_source(template_content, destination_content) ⇒ Object + .github_actions_standard_appraisal_gemfiles(config) ⇒ Object @@ -8778,7 +9033,7 @@

  • - .merge_rbs_template_source(template_content, destination_content, recipe) ⇒ Object + .github_actions_step_pins ⇒ Object @@ -8801,7 +9056,7 @@

  • - .merge_readme_template(template_content:, destination_content:, preserve_config: {}) ⇒ Object + .github_funding_platform_urls(platform, values) ⇒ Object @@ -8824,7 +9079,7 @@

  • - .merge_ruby_template_source(file_type, recipe, template_content, destination_content, facts: nil) ⇒ Object + .github_funding_urls(path, opencollective_disabled: false) ⇒ Object @@ -8847,7 +9102,7 @@

  • - .merge_template_gemfile_dependency_blocks(template_content, content, removable_gems, preserve_self_word_entries: false) ⇒ Object + .github_org_from_url(url) ⇒ Object @@ -8870,7 +9125,7 @@

  • - .metadata_value(metadata, key) ⇒ Object + .github_workflow_action_pin_key(record) ⇒ Object @@ -8893,7 +9148,7 @@

  • - .migrate_readme_logo_config(content) ⇒ Object + .github_workflow_action_pin_line_record(line, line_index) ⇒ Object @@ -8916,7 +9171,7 @@

  • - .min_ruby_version(requirement) ⇒ Object + .github_workflow_action_pin_records(content) ⇒ Object @@ -8939,7 +9194,7 @@

  • - .minimum_ruby_token(requirement) ⇒ Object + .github_workflow_template_pin_warnings(recipe_reports) ⇒ Object @@ -8962,7 +9217,7 @@

  • - .mit_readme_license_intro ⇒ Object + .github_workflow_template_recipe?(recipe) ⇒ Boolean @@ -8985,7 +9240,7 @@

  • - .monorepo_root_file_strategy(entry) ⇒ Object + .github_workflows_include?(project_root, needle) ⇒ Boolean @@ -9008,7 +9263,7 @@

  • - .monorepo_root_gemfile_dependency_lines ⇒ Object + .gitlab_repo_url(repository, repo_slug, suffix) ⇒ Object @@ -9031,7 +9286,7 @@

  • - .monorepo_root_gemfile_dependency_sync_step(project_root, report) ⇒ Object + .guard_main_gemfile_runtime_workspace_overrides(content) ⇒ Object @@ -9054,7 +9309,7 @@

  • - .monorepo_root_template_profile?(facts) ⇒ Boolean + .html_attribute_escape(value) ⇒ Object @@ -9077,7 +9332,7 @@

  • - .monorepo_subgem_kettle_config_profile_sync_step(project_root, report) ⇒ Object + .http_url?(value) ⇒ Boolean @@ -9100,7 +9355,7 @@

  • - .monorepo_subgem_template_entries(gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE) ⇒ Object + .inactive_packaged_template_cleanup_files(project_root, config = {}) ⇒ Object @@ -9123,7 +9378,7 @@

  • - .monorepo_subgem_template_entries_for_profile(gemspec_path, profile) ⇒ Object + .inactive_packaged_workflow?(relative_path, config = {}, include_patterns: nil) ⇒ Boolean @@ -9146,7 +9401,7 @@

  • - .monorepo_subgem_template_profile?(facts) ⇒ Boolean + .inactive_packaged_workflow_cleanup_files(project_root, config = {}, include_patterns: nil) ⇒ Object @@ -9169,7 +9424,7 @@

  • - .monorepo_subgem_template_profile_value?(profile) ⇒ Boolean + .indent_source(source, spaces) ⇒ Object @@ -9192,7 +9447,7 @@

  • - .monorepo_template_profile?(facts) ⇒ Boolean + .inject_appraisal_gemfiles(block, gemfiles) ⇒ Object @@ -9215,7 +9470,7 @@

  • - .non_mit_licenses?(licenses) ⇒ Boolean + .inject_framework_matrix_workflow_env(content, facts) ⇒ Object @@ -9238,7 +9493,7 @@

  • - .normalize_changelog(content, facts) ⇒ Object + .inject_main_gemfile_recording_eval(content, facts) ⇒ Object @@ -9261,7 +9516,7 @@

  • - .normalize_eval_gemfile_ruby_bucket(path) ⇒ Object + .inject_standard_appraisal_gemfiles(content, facts) ⇒ Object @@ -9284,7 +9539,7 @@

  • - .normalize_gemspec_project_emoji(line, facts, field:) ⇒ Object + .insert_after_line_sequence(content, sequence, insertion, error_message) ⇒ Object @@ -9307,7 +9562,7 @@

  • - .normalize_gemspec_receiver(line, from:, to:) ⇒ Object + .insert_gemfile_dependency_blocks(content, blocks) ⇒ Object @@ -9330,7 +9585,7 @@

  • - .normalize_generated_rakefile(content) ⇒ Object + .insert_lines_after(content, line_number, insertion) ⇒ Object @@ -9353,7 +9608,7 @@

  • - .normalize_git_source_url(url) ⇒ Object + .insert_lines_before(content, line_number, insertion) ⇒ Object @@ -9376,7 +9631,7 @@

  • - .normalize_github_actions_exec_cmd(command) ⇒ Object + .insert_missing_development_gemspec_dependency_lines(content, missing_lines) ⇒ Object @@ -9399,7 +9654,7 @@

  • - .normalize_list_option(value) ⇒ Object + .insert_missing_gemspec_assignment_sources(content, replacements, receiver:) ⇒ Object @@ -9422,7 +9677,7 @@

  • - .normalize_rakefile_section_spacing(content) ⇒ Object + .insert_missing_gemspec_files_assignment(content, template_content:, template_receiver:) ⇒ Object @@ -9445,7 +9700,7 @@

  • - .normalize_readme_blank_line_runs(content) ⇒ Object + .insert_missing_runtime_gemspec_dependency_lines(content, missing_lines, receiver:) ⇒ Object @@ -9468,7 +9723,7 @@

  • - .normalize_readme_heading(text) ⇒ Object + .insert_yaml_scalar_after_path(content, path, key, value) ⇒ Object @@ -9491,7 +9746,7 @@

  • - .normalize_readme_project_heading(content, facts) ⇒ Object + .install_tasks ⇒ Object @@ -9514,7 +9769,7 @@

  • - .normalize_readme_section_key(section) ⇒ Object + .integration_license_spdx(config, license) ⇒ Object @@ -9537,7 +9792,7 @@

  • - .normalize_readme_synopsis_heading(content, facts) ⇒ Object + .json_merge_options(recipe) ⇒ Object @@ -9560,7 +9815,7 @@

  • - .normalize_repository_topology(value) ⇒ Object + .kettle_config_bootstrap_facts(project_root, env, template_selection: {}) ⇒ Object @@ -9583,7 +9838,7 @@

  • - .normalize_template_profile(value) ⇒ Object + .kettle_config_bootstrap_recipe(bootstrap) ⇒ Object @@ -9606,7 +9861,7 @@

  • - .normalized_readme_logo_specs(value) ⇒ Object + .kettle_config_file_override_lines(path, strategy) ⇒ Object @@ -9629,7 +9884,7 @@

  • - .normalized_readme_logo_width(value) ⇒ Object + .kettle_config_template_entries_lines(entries) ⇒ Object @@ -9652,7 +9907,7 @@

  • - .normalized_readme_top_logo_options(value) ⇒ Object + .kettle_dev_local_gems(config) ⇒ Object @@ -9675,7 +9930,7 @@

  • - .opencollective_disabled?(config, env: ENV) ⇒ Boolean + .kettle_jem_config(project_root) ⇒ Object @@ -9698,7 +9953,7 @@

  • - .opencollective_disabled_file?(relative_path) ⇒ Boolean + .kettle_jem_config_path(project_root) ⇒ Object @@ -9721,7 +9976,7 @@

  • - .opencollective_disabled_files(project_root) ⇒ Object + .kettle_jem_config_relative_path(project_root) ⇒ Object @@ -9744,7 +9999,7 @@

  • - .opencollective_falsey_env(env) ⇒ Object + .known_license_template_basenames ⇒ Object @@ -9767,7 +10022,7 @@

  • - .opencollective_org(project_root, config, env, opencollective_disabled: false) ⇒ Object + .large_business_license_cell(author_email) ⇒ Object @@ -9790,7 +10045,7 @@

  • - .opencollective_org_config(config) ⇒ Object + .leading_space_count(line) ⇒ Object @@ -9813,7 +10068,7 @@

  • - .opencollective_org_env(env) ⇒ Object + .leading_whitespace(source) ⇒ Object @@ -9836,7 +10091,7 @@

  • - .opencollective_org_file(project_root) ⇒ Object + .legacy_rbs_consolidation_step(project_root, facts, entrypoint_require:) ⇒ Object @@ -9859,7 +10114,7 @@

  • - .opencollective_org_github_funding_file(project_root) ⇒ Object + .legacy_rbs_signature_paths(project_root, entrypoint_require) ⇒ Object @@ -9882,7 +10137,7 @@

  • - .opencollective_policy(config, env) ⇒ Object + .legacy_readme_top_logo_mode_options(value) ⇒ Object @@ -9905,7 +10160,7 @@

  • - .opt_in_workflow_cleanup_files(project_root, template_selection) ⇒ Object + .license_badge(spdx_id, ref: :license_ref) ⇒ Object @@ -9928,7 +10183,7 @@

  • - .packaged_gemfile_template_ruby_floor(target_path) ⇒ Object + .license_badge_img(spdx_id) ⇒ Object @@ -9951,7 +10206,7 @@

  • - .packaged_template_root ⇒ Object + .license_badge_ref(spdx_id) ⇒ Object @@ -9974,7 +10229,7 @@

  • - .paperclip_ref(name) ⇒ Object + .license_compat_badge(category) ⇒ Object @@ -9997,7 +10252,7 @@

  • - .parse_blame_porcelain(output, author_map) ⇒ Object + .license_compat_category(licenses) ⇒ Object @@ -10020,7 +10275,7 @@

  • - .phase_for_recipe(recipe_name, relative_path) ⇒ Object + .license_compat_img(category) ⇒ Object @@ -10043,7 +10298,7 @@

  • - .phase_reports_for(recipe_reports) ⇒ Object + .license_compat_ref(category) ⇒ Object @@ -10066,7 +10321,7 @@

  • - .plan_project(project_root, env: ENV, run_options: {}) ⇒ Object + .license_contact_line(author_email, context:) ⇒ Object @@ -10089,7 +10344,7 @@

  • - .plan_readme_style(project_root, env: ENV) ⇒ Object + .license_copyright_notice(copyright_lines, copyright_prefix, author) ⇒ Object @@ -10112,7 +10367,7 @@

  • - .plugin_lifecycle_diagnostic(plugin_registry, callbacks_run:, active_runner_phases:) ⇒ Object + .license_eye_compatible_licenses?(licenses) ⇒ Boolean @@ -10135,7 +10390,7 @@

  • - .plugin_names_from_config(config) ⇒ Object + .license_eye_dependency_license_entry(entry) ⇒ Object @@ -10158,7 +10413,7 @@

  • - .plugin_registry_for_project(project_root) ⇒ Object + .license_eye_dependency_licenses(config) ⇒ Object @@ -10181,7 +10436,7 @@

  • - .polyform_licenses?(licenses) ⇒ Boolean + .license_eye_flags(licenses) ⇒ Object @@ -10204,7 +10459,7 @@

  • - .post_apply_steps(project_root, report) ⇒ Object + .license_eye_mode(licenses) ⇒ Object @@ -10227,7 +10482,7 @@

  • - .postprocess_readme_content(content, facts, project_root: nil) ⇒ Object + .license_eye_primary_spdx(licenses, fallback) ⇒ Object @@ -10250,7 +10505,7 @@

  • - .preferred_template_source(template_root, configured_source, opencollective_disabled: false) ⇒ Object + .license_eye_workflow_badge(licenses, config = {}) ⇒ Object @@ -10273,7 +10528,7 @@

  • - .preferred_template_token_value(derived_value, config_value, env, env_key) ⇒ Object + .license_facts(config, gemspec_licenses, author: {}, author_email: nil, copyright: {}) ⇒ Object @@ -10296,7 +10551,7 @@

  • - .preflight_project!(project_root) ⇒ Object + .license_link(spdx_id) ⇒ Object @@ -10319,7 +10574,7 @@

  • - .preflight_ruby_syntax!(project_root, path) ⇒ Object + .license_md_content(licenses, author_email: nil) ⇒ Object @@ -10342,7 +10597,7 @@

  • - .prepare_github_workflow_template(content, recipe, facts) ⇒ Object + .license_template_tokens(license) ⇒ Object @@ -10365,7 +10620,7 @@

  • - .prepare_readme_template(content, readme_style) ⇒ Object + .license_use_case_guide_table(licenses, author_email: nil) ⇒ Object @@ -10388,7 +10643,7 @@

  • - .present_template_token_value?(value) ⇒ Boolean + .license_use_case_rows(licenses, author_email: nil) ⇒ Object @@ -10411,7 +10666,7 @@

  • - .preserve_gemspec_dependency_lines(template_content, destination_content, template_receiver:, destination_receiver:) ⇒ Object + .load_project_gemspec(gemspec_path) ⇒ Object @@ -10434,7 +10689,7 @@

  • - .preserve_gemspec_freeze_blocks(content, destination_content, facts:, receiver:) ⇒ Object + .local_gemfile_template_recipe?(recipe) ⇒ Boolean @@ -10457,7 +10712,7 @@

  • - .preserve_github_workflow_project_settings(recipe, content, destination_content, project_root:) ⇒ Object + .local_gems_assignment(content) ⇒ Object @@ -10480,7 +10735,7 @@

  • - .preserve_mise_project_settings(recipe, content, destination_content, project_root:) ⇒ Object + .local_gems_assignment_record(content) ⇒ Object @@ -10503,7 +10758,7 @@

  • - .preserve_readme_front_sections(template_content, destination_content) ⇒ Object + .local_modular_eval_paths_for_gem(project_root, gem_name) ⇒ Object @@ -10526,7 +10781,7 @@

  • - .preserve_readme_h1(merged_content, destination_content, preserve_config) ⇒ Object + .local_modular_runtime_eval_paths(project_root, gemspec_metadata, package_name:) ⇒ Object @@ -10549,7 +10804,7 @@

  • - .preserve_readme_managed_block(merged_content, destination_content, marker) ⇒ Object + .main_gemfile_after_gemspec_line(content) ⇒ Object @@ -10572,7 +10827,7 @@

  • - .preserve_readme_sections(template_content, destination_content, preserve_config) ⇒ Object + .main_gemfile_direct_sibling_block(gems, source_url:, project_root:, local_modular_eval_paths: []) ⇒ Object @@ -10595,7 +10850,7 @@

  • - .previous_nonblank_line_number(content, line_number) ⇒ Object + .main_gemfile_direct_sibling_records(content) ⇒ Object @@ -10618,7 +10873,7 @@

  • - .prism_parse_success(content) ⇒ Object + .main_gemfile_first_eval_gemfile_line(content) ⇒ Object @@ -10641,7 +10896,7 @@

  • - .prism_ruby_merge_options(recipe) ⇒ Object + .main_gemfile_nomono_bootstrap(package_name) ⇒ Object @@ -10664,7 +10919,7 @@

  • - .process_result_adapter_failure?(merge_result) ⇒ Boolean + .main_gemfile_nomono_bootstrap_source(template_content) ⇒ Object @@ -10687,7 +10942,7 @@

  • - .project_gemspec_declares_version_gem?(project_root) ⇒ Boolean + .main_gemfile_nomono_requirement_records(content) ⇒ Object @@ -10710,7 +10965,7 @@

  • - .project_gemspec_metadata(project_root, gemspec_path, spec: nil) ⇒ Object + .main_gemfile_recording_eval_path ⇒ Object @@ -10733,7 +10988,7 @@

  • - .project_gemspec_version(project_root) ⇒ Object + .main_gemfile_recording_insertion_index(content) ⇒ Object @@ -10756,7 +11011,7 @@

  • - .project_homepage_uri(config, env, yard_host:) ⇒ Object + .main_gemfile_templating_eval_line(content) ⇒ Object @@ -10779,7 +11034,7 @@

  • - .project_runtime_config_value(config, key) ⇒ Object + .managed_license_template_basename(target_path) ⇒ Object @@ -10802,7 +11057,7 @@

  • - .project_runtime_facts(config, env, package_name:, source_url:, author_domain:, min_ruby:, test_min_ruby:, version:) ⇒ Object + .markdown_heading_has_preserved_readme_ancestor?(heading_sections, index) ⇒ Boolean @@ -10825,7 +11080,7 @@

  • - .project_runtime_template_tokens(project_runtime) ⇒ Object + .markdown_heading_owners(content, source_label: "README.md") ⇒ Object @@ -10848,7 +11103,7 @@

  • - .project_yard_host(config, env, package_name:, author_domain:) ⇒ Object + .markdown_link_definition_source(owner, url) ⇒ Object @@ -10871,7 +11126,7 @@

  • - .prune_appraisals_below_min_ruby(content, min_ruby) ⇒ Object + .markdown_link_reference_definition_line?(line) ⇒ Boolean @@ -10894,7 +11149,7 @@

  • - .prune_appraisals_recording_entries(content, facts) ⇒ Object + .markdown_managed_block(content, marker) ⇒ Object @@ -10917,7 +11172,7 @@

  • - .prune_github_workflow_matrix_by_min_ruby(content, facts) ⇒ Object + .markdown_sections(content) ⇒ Object @@ -10940,7 +11195,7 @@

  • - .prune_legacy_kettle_config_keys(content) ⇒ Object + .markdown_source_lines(content) ⇒ Object @@ -10963,7 +11218,7 @@

  • - .prune_missing_workflow_link_definitions(content, workflow_paths) ⇒ Object + .merge_appraisal_blocks_with_prism(template_block, destination_block) ⇒ Object @@ -10986,7 +11241,7 @@

  • - .prune_readme_integration_badges(content, readme_style) ⇒ Object + .merge_appraisals_template_policy(content, facts:) ⇒ Object @@ -11009,7 +11264,7 @@

  • - .prune_unused_readme_logo_link_definitions(content) ⇒ Object + .merge_bash_template_source(template_content, destination_content, recipe) ⇒ Object @@ -11032,7 +11287,7 @@

  • - .prune_workflow_matrix_item?(mapping, minimum) ⇒ Boolean + .merge_changelog_template_source(template_content, destination_content, facts: nil) ⇒ Object @@ -11055,7 +11310,7 @@

  • - .quality_config_path?(path) ⇒ Boolean + .merge_config_template_source(recipe, template_content, destination_content, facts: nil, env: ENV) ⇒ Object @@ -11078,7 +11333,7 @@

  • - .quiet_gemspec_reader_load(project_root) ⇒ Object + .merge_dotenv_template_source(template_content, destination_content, recipe) ⇒ Object @@ -11101,7 +11356,7 @@

  • - .rakefile_default_task_call?(call) ⇒ Boolean + .merge_framework_matrix_appraisals(content, facts) ⇒ Object @@ -11124,7 +11379,7 @@

  • - .rakefile_default_task_records(content) ⇒ Object + .merge_gemfile_eval_bucket_entries(template_content, merged_content, destination_content: nil) ⇒ Object @@ -11147,7 +11402,7 @@

  • - .rakefile_require_records(content) ⇒ Object + .merge_gemfile_template_policy(content, facts:, template_content: nil, preserve_self_word_entries: false) ⇒ Object @@ -11170,7 +11425,7 @@

  • - .rakefile_scaffold_cleanup(content, facts) ⇒ Object + .merge_gemspec_files_assignment(content, template_content:, destination_content:, template_receiver:, destination_receiver:) ⇒ Object @@ -11193,7 +11448,7 @@

  • - .rakefile_scaffold_cleanup_recipe?(recipe) ⇒ Boolean + .merge_gemspec_files_assignment_source(merged_record:, template_record:, destination_record:) ⇒ Object @@ -11216,7 +11471,7 @@

  • - .rakefile_scaffold_delete_selectors(content) ⇒ Object + .merge_gemspec_files_assignment_with_destination_splats(merged_parts:, destination_parts:) ⇒ Object @@ -11239,7 +11494,7 @@

  • - .rakefile_selector(selector_id, start_line, end_line, reason) ⇒ Object + .merge_gemspec_template_source(template_content, destination_content, facts: nil, env: ENV) ⇒ Object @@ -11262,7 +11517,7 @@

  • - .rakefile_task_block_selectors(content) ⇒ Object + .merge_json_template_source(template_content, destination_content, recipe, file_type) ⇒ Object @@ -11285,7 +11540,7 @@

  • - .rakefile_task_class_records(content) ⇒ Object + .merge_local_gem_overrides(content, destination_content, facts:, template_content: nil) ⇒ Object @@ -11308,7 +11563,7 @@

  • - .rakefile_template_default_task?(content, record) ⇒ Boolean + .merge_prism_gemfile_template_source(template_content, destination_content) ⇒ Object @@ -11331,7 +11586,7 @@

  • - .rbs_merge_options(recipe) ⇒ Object + .merge_rbs_signature_sources(template_content, destination_content) ⇒ Object @@ -11354,7 +11609,7 @@

  • - .read_project_file(project_root, relative_path) ⇒ Object + .merge_rbs_template_source(template_content, destination_content, recipe) ⇒ Object @@ -11377,7 +11632,7 @@

  • - .read_project_files(project_root, pack) ⇒ Object + .merge_readme_template(template_content:, destination_content:, preserve_config: {}) ⇒ Object @@ -11400,7 +11655,7 @@

  • - .readme_config_hash(config) ⇒ Object + .merge_ruby_template_source(file_type, recipe, template_content, destination_content, facts: nil) ⇒ Object @@ -11423,7 +11678,7 @@

  • - .readme_copyright_notice(copyright_lines, copyright_prefix, author) ⇒ Object + .merge_template_gemfile_dependency_blocks(template_content, content, removable_gems, preserve_self_word_entries: false) ⇒ Object @@ -11446,7 +11701,7 @@

  • - .readme_default_logo_width(entries, one:, two:) ⇒ Object + .metadata_value(metadata, key) ⇒ Object @@ -11469,7 +11724,7 @@

  • - .readme_destination_front_sections(destination_content) ⇒ Object + .migrate_readme_logo_config(content) ⇒ Object @@ -11492,7 +11747,7 @@

  • - .readme_disabled_integrations(readme) ⇒ Object + .min_ruby_version(requirement) ⇒ Object @@ -11515,7 +11770,7 @@

  • - .readme_extra_preserved_sections_by_anchor(destination_sections, template_bases, preserve_targets) ⇒ Object + .minimum_ruby_token(requirement) ⇒ Object @@ -11538,7 +11793,7 @@

  • - .readme_family_intro_and_backend_matrix(readme_style = {}) ⇒ Object + .mit_readme_license_intro ⇒ Object @@ -11561,7 +11816,7 @@

  • - .readme_floss_funding_enabled?(license, config_value) ⇒ Boolean + .monorepo_root_file_strategy(entry) ⇒ Object @@ -11584,7 +11839,7 @@

  • - .readme_fossa_project(readme, repository) ⇒ Object + .monorepo_root_gemfile_dependency_lines ⇒ Object @@ -11607,7 +11862,7 @@

  • - .readme_fossa_template_tokens(readme_style) ⇒ Object + .monorepo_root_gemfile_dependency_sync_step(project_root, report) ⇒ Object @@ -11630,7 +11885,7 @@

  • - .readme_front_section_preserved?(section) ⇒ Boolean + .monorepo_root_template_profile?(facts) ⇒ Boolean @@ -11653,7 +11908,7 @@

  • - .readme_h2_synopsis_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object + .monorepo_subgem_kettle_config_profile_sync_step(project_root, report) ⇒ Object @@ -11676,7 +11931,7 @@

  • - .readme_h2_synopsis_logo_options(config) ⇒ Object + .monorepo_subgem_template_entries(gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE) ⇒ Object @@ -11699,7 +11954,7 @@

  • - .readme_h2_synopsis_logo_row(entries) ⇒ Object + .monorepo_subgem_template_entries_for_profile(gemspec_path, profile) ⇒ Object @@ -11722,7 +11977,7 @@

  • - .readme_h2_synopsis_logo_specs(config) ⇒ Object + .monorepo_subgem_template_profile?(facts) ⇒ Boolean @@ -11745,7 +12000,7 @@

  • - .readme_integration_configured?(project_root, integration) ⇒ Boolean + .monorepo_subgem_template_profile_value?(profile) ⇒ Boolean @@ -11768,7 +12023,7 @@

  • - .readme_integration_project_root(project_root, template_profile, repository) ⇒ Object + .monorepo_template_profile?(facts) ⇒ Boolean @@ -11791,7 +12046,7 @@

  • - .readme_kloc_from_changelog(project_root, version) ⇒ Object + .namespace_descendant?(namespace, parent) ⇒ Boolean @@ -11814,7 +12069,7 @@

  • - .readme_license_intro(licenses, author_email: nil) ⇒ Object + .nested_templating_guard_records(content) ⇒ Object @@ -11837,7 +12092,7 @@

  • - .readme_license_refs(expression, compat_category) ⇒ Object + .node_enclosed_by_ranges?(node, ranges) ⇒ Boolean @@ -11860,7 +12115,7 @@

  • - .readme_logo_config_value(spec) ⇒ Object + .non_default_version_gem_entrypoint?(project_root, entrypoint_require) ⇒ Boolean @@ -11883,7 +12138,7 @@

  • - .readme_logo_facts(config, package_name:, github_org:, repository: {}) ⇒ Object + .non_mit_licenses?(licenses) ⇒ Boolean @@ -11906,7 +12161,7 @@

  • - .readme_logo_html(entry, align:, width: nil) ⇒ Object + .normalize_changelog(content, facts) ⇒ Object @@ -11929,7 +12184,7 @@

  • - .readme_logo_options_from_config(config, primary_key, secondary_key, defaults) ⇒ Object + .normalize_conditional_body_indentation(source) ⇒ Object @@ -11952,7 +12207,7 @@

  • - .readme_logo_specs_from_config(config, primary_key, secondary_key, defaults) ⇒ Object + .normalize_eval_gemfile_ruby_bucket(path) ⇒ Object @@ -11975,7 +12230,7 @@

  • - .readme_logo_template_tokens(readme_logo) ⇒ Object + .normalize_gemspec_dependency_version_requirements(source, receiver:, namespace:) ⇒ Object @@ -11998,7 +12253,7 @@

  • - .readme_metadata_block(facts) ⇒ Object + .normalize_gemspec_project_emoji(line, facts, field:) ⇒ Object @@ -12021,7 +12276,7 @@

  • - .readme_metadata_license_expression(facts) ⇒ Object + .normalize_gemspec_receiver(line, from:, to:) ⇒ Object @@ -12044,7 +12299,7 @@

  • - .readme_metadata_table_cell(value) ⇒ Object + .normalize_generated_image_url(url) ⇒ Object @@ -12067,7 +12322,7 @@

  • - .readme_preserve_config(config) ⇒ Object + .normalize_generated_rakefile(content) ⇒ Object @@ -12090,7 +12345,7 @@

  • - .readme_preserve_config_without_partial_sections(preserve_config, partial_sections) ⇒ Object + .normalize_git_source_url(url) ⇒ Object @@ -12113,7 +12368,7 @@

  • - .readme_preserve_targets(template_sections, destination_lookup, preserve_config) ⇒ Object + .normalize_github_actions_exec_cmd(command) ⇒ Object @@ -12136,7 +12391,7 @@

  • - .readme_project_emoji(project_root) ⇒ Object + .normalize_integration_name(name) ⇒ Object @@ -12159,7 +12414,7 @@

  • - .readme_section_contains_badge_cloud?(section) ⇒ Boolean + .normalize_kettle_jem_config(config) ⇒ Object @@ -12182,7 +12437,7 @@

  • - .readme_section_partials(project_root, config, readme) ⇒ Object + .normalize_list_option(value) ⇒ Object @@ -12205,7 +12460,7 @@

  • - .readme_section_partials_for_render(readme_style, facts) ⇒ Object + .normalize_main_gemfile_nomono_requirements(content) ⇒ Object @@ -12228,7 +12483,7 @@

  • - .readme_style_facts(project_root, config, license, template_profile: nil, repository: nil) ⇒ Object + .normalize_non_default_version_gem_version_spec(project_root, version_spec_path, entrypoint_require) ⇒ Object @@ -12251,7 +12506,7 @@

  • - .readme_template_tokens(facts) ⇒ Object + .normalize_rakefile_section_spacing(content) ⇒ Object @@ -12274,7 +12529,7 @@

  • - .readme_top_logo_credit_separator(type) ⇒ Object + .normalize_readme_blank_line_runs(content) ⇒ Object @@ -12297,7 +12552,7 @@

  • - .readme_top_logo_default_alt(type, slug) ⇒ Object + .normalize_readme_heading(text) ⇒ Object @@ -12320,7 +12575,7 @@

  • - .readme_top_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object + .normalize_readme_project_heading(content, facts) ⇒ Object @@ -12343,7 +12598,7 @@

  • - .readme_top_logo_entries_with_asset_size(entries) ⇒ Object + .normalize_readme_section_key(section) ⇒ Object @@ -12366,7 +12621,7 @@

  • - .readme_top_logo_entry_from_config(logo, org:, gem_name:, repository: {}) ⇒ Object + .normalize_readme_synopsis_heading(content, facts) ⇒ Object @@ -12389,7 +12644,7 @@

  • - .readme_top_logo_entry_from_option(option, org:, gem_name:, repository: {}) ⇒ Object + .normalize_repository_topology(value) ⇒ Object @@ -12412,7 +12667,7 @@

  • - .readme_top_logo_options(config) ⇒ Object + .normalize_simplecov_template_source(content) ⇒ Object @@ -12435,7 +12690,7 @@

  • - .readme_top_logo_refs(entries) ⇒ Object + .normalize_simplecov_track_files_calls(content) ⇒ Object @@ -12458,7 +12713,7 @@

  • - .readme_top_logo_row(entries) ⇒ Object + .normalize_spec_helper_simplecov_template_source(content) ⇒ Object @@ -12481,7 +12736,7 @@

  • - .readme_url_template_tokens(repository, package_name, github_org) ⇒ Object + .normalize_template_profile(value) ⇒ Object @@ -12504,7 +12759,7 @@

  • - .readme_workflow_path_from_url(url) ⇒ Object + .normalize_templating_guard_indentation(content) ⇒ Object @@ -12527,7 +12782,7 @@

  • - .readme_workflow_paths(project_root) ⇒ Object + .normalized_readme_logo_specs(value) ⇒ Object @@ -12550,7 +12805,7 @@

  • - .recipe_decision_category(recipe) ⇒ Object + .normalized_readme_logo_width(value) ⇒ Object @@ -12573,7 +12828,7 @@

  • - .recipe_decision_diagnostics(recipe) ⇒ Object + .normalized_readme_top_logo_options(value) ⇒ Object @@ -12596,7 +12851,7 @@

  • - .recipe_decision_evaluation(decision_policy:, recipe:, changed:, destination_existed:) ⇒ Object + .opencollective_disabled?(config, env: ENV) ⇒ Boolean @@ -12619,7 +12874,7 @@

  • - .recipe_default_action(recipe, changed:, destination_existed:) ⇒ Object + .opencollective_disabled_file?(relative_path) ⇒ Boolean @@ -12642,7 +12897,7 @@

  • - .recipe_entry(name, target_path, provider_family, primitive, facts:, provider_backend: nil, selectors: []) ⇒ Object + .opencollective_disabled_files(project_root) ⇒ Object @@ -12665,7 +12920,7 @@

  • - .recipe_filter_patterns(template_selection) ⇒ Object + .opencollective_fallback_warnings(funding, github_org) ⇒ Object @@ -12688,7 +12943,7 @@

  • - .recipe_pack(facts) ⇒ Object + .opencollective_falsey_env(env) ⇒ Object @@ -12711,7 +12966,7 @@

  • - .recipe_report_metadata(recipe) ⇒ Object + .opencollective_org(project_root, config, env, opencollective_disabled: false) ⇒ Object @@ -12734,7 +12989,7 @@

  • - .recipe_report_phase(recipe_report) ⇒ Object + .opencollective_org_config(config) ⇒ Object @@ -12757,7 +13012,7 @@

  • - .recipe_run_stats(recipe_reports, diagnostics: []) ⇒ Object + .opencollective_org_env(env) ⇒ Object @@ -12780,7 +13035,7 @@

  • - .recipe_run_stats_summary(stats) ⇒ Object + .opencollective_org_file(project_root) ⇒ Object @@ -12803,7 +13058,7 @@

  • - .recipe_runtime_context(recipe, facts, deletion) ⇒ Object + .opencollective_org_github_funding_file(project_root) ⇒ Object @@ -12826,7 +13081,7 @@

  • - .recipe_template_content(project_root, recipe) ⇒ Object + .opencollective_policy(config, env) ⇒ Object @@ -12849,7 +13104,7 @@

  • - .remove_duplicate_gemspec_assignments(content, receiver:, fields:) ⇒ Object + .opt_in_workflow_cleanup_files(project_root, template_selection) ⇒ Object @@ -12872,7 +13127,7 @@

  • - .remove_gemfile_dependency_blocks(content, gem_names) ⇒ Object + .outdent_line(line, spaces) ⇒ Object @@ -12895,7 +13150,7 @@

  • - .remove_gemfile_dependency_lines(content, gem_names) ⇒ Object + .outdent_source(source, spaces) ⇒ Object @@ -12918,7 +13173,7 @@

  • - .remove_gemfile_percent_w_entries(content, gem_names) ⇒ Object + .package_runtime_dependency_names(facts) ⇒ Object @@ -12941,7 +13196,7 @@

  • - .remove_gemspec_assignment(content, receiver:, field:) ⇒ Object + .packaged_gemfile_template_ruby_floor(target_path) ⇒ Object @@ -12964,7 +13219,7 @@

  • - .remove_gemspec_dependency_lines(content, receiver:, names:, runtime_only: false) ⇒ Object + .packaged_template_root ⇒ Object @@ -12987,7 +13242,7 @@

  • - .remove_gemspec_development_dependencies_already_runtime(content, receiver:) ⇒ Object + .paired_modular_gemfile_path(local_relative_path) ⇒ Object @@ -13010,7 +13265,7 @@

  • - .remove_gemspec_legacy_version_loader_preamble(content) ⇒ Object + .paperclip_ref(name) ⇒ Object @@ -13033,7 +13288,7 @@

  • - .remove_gemspec_self_dependency_lines(content, package_name, receiver:) ⇒ Object + .parse_blame_porcelain(output, author_map) ⇒ Object @@ -13056,7 +13311,7 @@

  • - .remove_gemspec_version_gem_dependency_when_runtime_incompatible(content, facts, receiver:) ⇒ Object + .parse_event_types(types) ⇒ Object @@ -13079,7 +13334,7 @@

  • - .remove_legacy_version_signature_alias(project_root, signature_path) ⇒ Object + .phase_for_recipe(recipe_name, relative_path) ⇒ Object @@ -13102,7 +13357,7 @@

  • - .remove_readme_badge_and_refs(content, badge_source, link_labels) ⇒ Object + .phase_reports_for(recipe_reports) ⇒ Object @@ -13125,7 +13380,7 @@

  • - .remove_readme_sections(content, section_bases) ⇒ Object + .plan_project(project_root, env: ENV, run_options: {}) ⇒ Object @@ -13148,7 +13403,7 @@

  • - .remove_ruby_comment_lines_containing(content, text) ⇒ Object + .plan_readme_style(project_root, env: ENV) ⇒ Object @@ -13171,7 +13426,7 @@

  • - .remove_top_level_yaml_key_lines(content, key) ⇒ Object + .plugin_lifecycle_diagnostic(plugin_registry, callbacks_run:, active_runner_phases:) ⇒ Object @@ -13194,7 +13449,7 @@

  • - .remove_version_gem_entrypoint_references(content) ⇒ Object + .plugin_names_from_config(config) ⇒ Object @@ -13217,7 +13472,7 @@

  • - .remove_yaml_scalar_path(content, path) ⇒ Object + .plugin_registry_for_project(project_root) ⇒ Object @@ -13240,7 +13495,7 @@

  • - .render_thin_readme(facts, readme_style, original, preserve_config) ⇒ Object + .polyform_licenses?(licenses) ⇒ Boolean @@ -13263,7 +13518,7 @@

  • - .replace_existing_markdown_managed_block(content, marker, replacement) ⇒ Object + .post_apply_steps(project_root, report) ⇒ Object @@ -13286,7 +13541,7 @@

  • - .replace_gemspec_assignment_sources(content, replacements, receiver:) ⇒ Object + .postprocess_readme_content(content, facts, project_root: nil) ⇒ Object @@ -13309,7 +13564,7 @@

  • - .replace_gemspec_version_assignment(content, receiver:, rhs:) ⇒ Object + .preferred_template_source(template_root, configured_source, opencollective_disabled: false) ⇒ Object @@ -13332,7 +13587,7 @@

  • - .replace_kettle_config_bootstrap_licenses(content, licenses) ⇒ Object + .preferred_template_token_value(derived_value, config_value, env, env_key) ⇒ Object @@ -13355,7 +13610,7 @@

  • - .replace_kettle_config_bootstrap_project_emoji(content, emoji) ⇒ Object + .preflight_project!(project_root) ⇒ Object @@ -13378,7 +13633,7 @@

  • - .replace_local_gems_assignment(content, gems) ⇒ Object + .preflight_ruby_syntax!(project_root, path) ⇒ Object @@ -13401,7 +13656,7 @@

  • - .replace_markdown_managed_block(content, marker, replacement) ⇒ Object + .prepare_github_workflow_template(content, recipe, facts) ⇒ Object @@ -13424,7 +13679,7 @@

  • - .replace_markdown_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object + .prepare_readme_template(content, readme_style) ⇒ Object @@ -13447,7 +13702,7 @@

  • - .replace_markdown_with_ast_crispr(content, target, replacement) ⇒ Object + .present_template_token_value?(value) ⇒ Boolean @@ -13470,7 +13725,7 @@

  • - .replace_matching_gemspec_dependency_lines(content, destination_dependencies, receiver:) ⇒ Object + .preserve_gemspec_dependency_lines(template_content, destination_content, template_receiver:, destination_receiver:, facts: nil) ⇒ Object @@ -13493,7 +13748,7 @@

  • - .replace_record_ranges(content, records_by_line) ⇒ Object + .preserve_gemspec_freeze_blocks(content, destination_content, facts:, receiver:) ⇒ Object @@ -13516,7 +13771,7 @@

  • - .replace_ruby_managed_block(content, replacement) ⇒ Object + .preserve_github_workflow_project_settings(recipe, content, destination_content, project_root:) ⇒ Object @@ -13539,7 +13794,7 @@

  • - .replace_ruby_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object + .preserve_mise_project_settings(recipe, content, destination_content, project_root:) ⇒ Object @@ -13562,7 +13817,7 @@

  • - .replace_source_offsets(content, replacements) ⇒ Object + .preserve_newer_github_workflow_action_pins(content, destination_content) ⇒ Object @@ -13585,7 +13840,7 @@

  • - .replace_source_range_lines(content, start_line, end_line, replacement) ⇒ Object + .preserve_readme_front_sections(template_content, destination_content) ⇒ Object @@ -13608,7 +13863,7 @@

  • - .replace_text_managed_block(content, replacement) ⇒ Object + .preserve_readme_h1(merged_content, destination_content, preserve_config) ⇒ Object @@ -13631,7 +13886,7 @@

  • - .replace_text_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object + .preserve_readme_managed_block(merged_content, destination_content, marker) ⇒ Object @@ -13654,7 +13909,7 @@

  • - .replace_toml_string_scalar_line(content, key, value) ⇒ Object + .preserve_readme_sections(template_content, destination_content, preserve_config) ⇒ Object @@ -13677,7 +13932,7 @@

  • - .replace_yaml_node_lines(content, key, replacement) ⇒ Object + .previous_nonblank_line_number(content, line_number) ⇒ Object @@ -13700,7 +13955,7 @@

  • - .replace_yaml_scalar_line(content, key, value) ⇒ Object + .prism_call_nodes(node) ⇒ Object @@ -13723,7 +13978,7 @@

  • - .replace_yaml_scalar_path(content, path, value) ⇒ Object + .prism_parse_success(content) ⇒ Object @@ -13746,7 +14001,7 @@

  • - .repository_facts(project_root, source_url, package_name:, repository_topology:) ⇒ Object + .prism_ruby_merge_options(recipe) ⇒ Object @@ -13769,7 +14024,7 @@

  • - .repository_monorepo_subproject?(repository) ⇒ Boolean + .prism_subtree_contains_call?(node, call_name) ⇒ Boolean @@ -13792,7 +14047,7 @@

  • - .repository_name_from_source_url(source_url) ⇒ Object + .prism_subtree_contains_simplecov_require?(node) ⇒ Boolean @@ -13815,7 +14070,7 @@

  • - .repository_project_logo_href(repository, slug:, org:, gem_name:) ⇒ Object + .prism_subtree_contains_string?(node, string) ⇒ Boolean @@ -13838,7 +14093,7 @@

  • - .repository_project_logo_slug(repository, org:, gem_name:) ⇒ Object + .process_result_adapter_failure?(merge_result) ⇒ Boolean @@ -13861,7 +14116,7 @@

  • - .repository_resource_urls(repository) ⇒ Object + .project_appraisals_recording_enabled?(project_root) ⇒ Boolean @@ -13884,7 +14139,7 @@

  • - .repository_root_url(source_url) ⇒ Object + .project_gemspec_declares_version_gem?(project_root) ⇒ Boolean @@ -13907,7 +14162,7 @@

  • - .repository_topology_for(config, env, template_selection) ⇒ Object + .project_gemspec_metadata(project_root, gemspec_path, spec: nil) ⇒ Object @@ -13930,7 +14185,7 @@

  • - .resolve_template_tokens(content, tokens, scan_unresolved: true) ⇒ Object + .project_gemspec_version(project_root) ⇒ Object @@ -13953,7 +14208,7 @@

  • - .resolve_uncommitted_author!(project_root, author_map) ⇒ Object + .project_homepage_uri(config, env, yard_host:, gemspec_homepage_uri: nil) ⇒ Object @@ -13976,7 +14231,7 @@

  • - .resolved_licenses(config, gemspec_licenses) ⇒ Object + .project_namespace(entrypoint_namespace:, version_namespace:, metadata_namespace:, default_namespace:) ⇒ Object @@ -13999,7 +14254,7 @@

  • - .retired_gemspec_development_dependency_key?(key) ⇒ Boolean + .project_recording_enabled?(project_root, config) ⇒ Boolean @@ -14022,7 +14277,7 @@

  • - .rewrite_gemspec_version_loader(content, facts:) ⇒ Object + .project_relative_path(path, project_root) ⇒ Object @@ -14045,7 +14300,7 @@

  • - .rewrite_markdown_reference_links(content, links) ⇒ Object + .project_runtime_config_value(config, key) ⇒ Object @@ -14068,7 +14323,7 @@

  • - .rubocop_target_ruby_token(min_ruby) ⇒ Object + .project_runtime_facts(config, env, package_name:, source_url:, author_domain:, min_ruby:, test_min_ruby:, version:, project_root: nil, gemspec_metadata: {}) ⇒ Object @@ -14091,7 +14346,7 @@

  • - .rubocop_template_tokens(min_ruby) ⇒ Object + .project_runtime_template_tokens(project_runtime) ⇒ Object @@ -14114,7 +14369,7 @@

  • - .rubocop_tokens_for(min_ruby) ⇒ Object + .project_yard_host(config, env, package_name:, author_domain:) ⇒ Object @@ -14137,7 +14392,7 @@

  • - .ruby_appraisal_name_version(name) ⇒ Object + .prune_appraisals_below_min_ruby(content, min_ruby) ⇒ Object @@ -14160,7 +14415,7 @@

  • - .ruby_appraisal_names_below(content, min_ruby) ⇒ Object + .prune_appraisals_recording_entries(content, facts) ⇒ Object @@ -14183,7 +14438,7 @@

  • - .ruby_array_literal(values) ⇒ Object + .prune_empty_parent_directories(project_root, relative_path) ⇒ Object @@ -14206,7 +14461,7 @@

  • - .ruby_bucket_path_segment?(segment) ⇒ Boolean + .prune_github_workflow_matrix_by_min_ruby(content, facts) ⇒ Object @@ -14229,7 +14484,7 @@

  • - .ruby_call_records(content, call_name) ⇒ Object + .prune_legacy_kettle_config_keys(content) ⇒ Object @@ -14252,7 +14507,7 @@

  • - .ruby_constant_path_segments(node) ⇒ Object + .prune_missing_workflow_link_definitions(content, workflow_paths) ⇒ Object @@ -14275,7 +14530,7 @@

  • - .ruby_double_quoted_string_body(value) ⇒ Object + .prune_readme_integration_badges(content, readme_style) ⇒ Object @@ -14298,7 +14553,7 @@

  • - .ruby_engines_config(config) ⇒ Object + .prune_unused_readme_logo_link_definitions(content) ⇒ Object @@ -14321,7 +14576,7 @@

  • - .ruby_first_string_argument(owner) ⇒ Object + .prune_workflow_matrix_item?(mapping, minimum) ⇒ Boolean @@ -14344,7 +14599,7 @@

  • - .ruby_keyword_string_argument(call, key) ⇒ Object + .quality_config_path?(path) ⇒ Boolean @@ -14367,7 +14622,7 @@

  • - .ruby_merge_options(recipe, merge_template_requires:) ⇒ Object + .quiet_gemspec_reader_load(project_root) ⇒ Object @@ -14390,7 +14645,7 @@

  • - .ruby_method_move_policy(recipe) ⇒ Object + .rakefile_default_task_call?(call) ⇒ Boolean @@ -14413,7 +14668,7 @@

  • - .ruby_multiline_word_array_source(names, indent:) ⇒ Object + .rakefile_default_task_records(content) ⇒ Object @@ -14436,7 +14691,7 @@

  • - .ruby_require_aliases(recipe, facts = nil) ⇒ Object + .rakefile_require_records(content) ⇒ Object @@ -14459,7 +14714,7 @@

  • - .ruby_require_call?(owner, method_name, argument) ⇒ Boolean + .rakefile_scaffold_cleanup(content, facts) ⇒ Object @@ -14482,7 +14737,7 @@

  • - .ruby_string_argument(call) ⇒ Object + .rakefile_scaffold_cleanup_recipe?(recipe) ⇒ Boolean @@ -14505,7 +14760,7 @@

  • - .ruby_string_argument_at(call, index) ⇒ Object + .rakefile_scaffold_delete_selectors(content) ⇒ Object @@ -14528,7 +14783,7 @@

  • - .ruby_string_arguments(call) ⇒ Object + .rakefile_selector(selector_id, start_line, end_line, reason) ⇒ Object @@ -14551,7 +14806,7 @@

  • - .ruby_template_policy_report(recipe:, request:, original:, final:) ⇒ Object + .rakefile_task_block_selectors(content) ⇒ Object @@ -14574,7 +14829,7 @@

  • - .ruby_top_level_require?(content, method_name, argument) ⇒ Boolean + .rakefile_task_class_records(content) ⇒ Object @@ -14597,7 +14852,7 @@

  • - .ruby_top_level_require_records(content) ⇒ Object + .rakefile_template_default_task?(content, record) ⇒ Boolean @@ -14620,7 +14875,7 @@

  • - .ruby_version_class_eval_namespaces(content) ⇒ Object + .rbs_merge_options(recipe) ⇒ Object @@ -14643,7 +14898,7 @@

  • - .ruby_version_constant_value(content) ⇒ Object + .read_project_file(project_root, relative_path) ⇒ Object @@ -14666,7 +14921,7 @@

  • - .ruby_version_module_namespace(content) ⇒ Object + .read_project_files(project_root, pack) ⇒ Object @@ -14689,7 +14944,7 @@

  • - .ruby_version_module_namespace_for(node, namespace) ⇒ Object + .readme_config_hash(config) ⇒ Object @@ -14712,7 +14967,7 @@

  • - .ruby_word_array_names(node) ⇒ Object + .readme_copyright_notice(copyright_lines, copyright_prefix, author) ⇒ Object @@ -14735,7 +14990,7 @@

  • - .ruby_word_array_node?(node) ⇒ Boolean + .readme_default_logo_width(entries, one:, two:) ⇒ Object @@ -14758,7 +15013,7 @@

  • - .ruby_word_array_nodes(content) ⇒ Object + .readme_destination_front_sections(destination_content) ⇒ Object @@ -14781,7 +15036,7 @@

  • - .ruby_word_array_records(content) ⇒ Object + .readme_dev_test_stack_table(package_name) ⇒ Object @@ -14804,7 +15059,7 @@

  • - .run_apply_phases(project_root, report) ⇒ Object + .readme_disabled_integrations(readme, integration_disabled: []) ⇒ Object @@ -14827,7 +15082,7 @@

  • - .runtime_context_value(request, *path) ⇒ Object + .readme_extra_preserved_sections_by_anchor(destination_sections, template_bases, preserve_targets) ⇒ Object @@ -14850,7 +15105,7 @@

  • - .runtime_gemspec_dependency_insertion_index(lines, receiver:) ⇒ Object + .readme_family_intro_and_backend_matrix(readme_style = {}) ⇒ Object @@ -14873,7 +15128,7 @@

  • - .security_supported_version_token(version) ⇒ Object + .readme_floss_funding_enabled?(license, config_value) ⇒ Boolean @@ -14896,7 +15151,7 @@

  • - .selected_template_path?(relative_path, patterns) ⇒ Boolean + .readme_fossa_project(readme, repository) ⇒ Object @@ -14919,7 +15174,7 @@

  • - .semantic_readme_heading(text) ⇒ Object + .readme_fossa_template_tokens(readme_style) ⇒ Object @@ -14942,7 +15197,7 @@

  • - .setup_execution_context(env, run_options) ⇒ Object + .readme_front_section_preserved?(section) ⇒ Boolean @@ -14965,7 +15220,7 @@

  • - .setup_guidance_diagnostic(config_existed:) ⇒ Object + .readme_h2_synopsis_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object @@ -14988,7 +15243,7 @@

  • - .setup_project(project_root, env: ENV, run_options: {}, command_runner: nil) ⇒ Object + .readme_h2_synopsis_logo_options(config) ⇒ Object @@ -15011,7 +15266,7 @@

  • - .shield_token(value) ⇒ Object + .readme_h2_synopsis_logo_row(entries) ⇒ Object @@ -15034,7 +15289,7 @@

  • - .shunted_effective_floor(min_ruby) ⇒ Object + .readme_h2_synopsis_logo_specs(config) ⇒ Object @@ -15057,7 +15312,7 @@

  • - .shunted_gemfile_block(gemspec, facts, run_options) ⇒ Object + .readme_integration_configured?(project_root, integration) ⇒ Boolean @@ -15080,7 +15335,7 @@

  • - .shunted_gemfile_managed_block(dependencies) ⇒ Object + .readme_integration_project_root(project_root, template_profile, repository) ⇒ Object @@ -15103,7 +15358,7 @@

  • - .skip_packaged_gemfile_template?(target_path, config) ⇒ Boolean + .readme_kloc_from_changelog(project_root, version) ⇒ Object @@ -15126,7 +15381,7 @@

  • - .skip_packaged_license_template?(target_path, config) ⇒ Boolean + .readme_license_intro(licenses, author_email: nil) ⇒ Object @@ -15149,7 +15404,7 @@

  • - .skip_packaged_workflow_template?(target_path, config, include_patterns: nil) ⇒ Boolean + .readme_license_refs(expression, compat_category) ⇒ Object @@ -15172,7 +15427,7 @@

  • - .snapshot_changed_files(project_root, changed_files) ⇒ Object + .readme_logo_config_value(spec) ⇒ Object @@ -15195,7 +15450,7 @@

  • - .social_facts(config, env) ⇒ Object + .readme_logo_facts(config, package_name:, github_org:, repository: {}) ⇒ Object @@ -15218,7 +15473,7 @@

  • - .social_template_tokens(social) ⇒ Object + .readme_logo_html(entry, align:, width: nil) ⇒ Object @@ -15241,7 +15496,7 @@

  • - .social_token_value(social_config, env, key) ⇒ Object + .readme_logo_options_from_config(config, primary_key, secondary_key, defaults) ⇒ Object @@ -15264,7 +15519,7 @@

  • - .sort_runtime_gemspec_dependency_lines(content, receiver:) ⇒ Object + .readme_logo_specs_from_config(config, primary_key, secondary_key, defaults) ⇒ Object @@ -15287,7 +15542,7 @@

  • - .source_blob_url(source_url, path) ⇒ Object + .readme_logo_template_tokens(readme_logo) ⇒ Object @@ -15310,7 +15565,7 @@

  • - .source_tree_url(source_url, path) ⇒ Object + .readme_metadata_block(facts) ⇒ Object @@ -15333,7 +15588,7 @@

  • - .spdx_basename(spdx_id) ⇒ Object + .readme_metadata_license_expression(facts) ⇒ Object @@ -15356,7 +15611,7 @@

  • - .spdx_from_basename(basename) ⇒ Object + .readme_metadata_table_cell(value) ⇒ Object @@ -15379,7 +15634,7 @@

  • - .stale_versioned_engine_workflow?(relative_path) ⇒ Boolean + .readme_preserve_config(config) ⇒ Object @@ -15402,7 +15657,7 @@

  • - .standard_test_appraisal_names(content) ⇒ Object + .readme_preserve_config_without_partial_sections(preserve_config, partial_sections) ⇒ Object @@ -15425,7 +15680,7 @@

  • - .static_gemspec_metadata_assignment(content, key) ⇒ Object + .readme_preserve_targets(template_sections, destination_lookup, preserve_config) ⇒ Object @@ -15448,7 +15703,7 @@

  • - .static_gemspec_metadata_key_assigned?(content, key) ⇒ Boolean + .readme_project_emoji(project_root) ⇒ Object @@ -15471,7 +15726,7 @@

  • - .static_project_gemspec_metadata(gemspec_path) ⇒ Object + .readme_section_contains_badge_cloud?(section) ⇒ Boolean @@ -15494,7 +15749,7 @@

  • - .step_report_metadata(recipe, deletion) ⇒ Object + .readme_section_has_preserved_ancestor?(sections, index, preserve_targets) ⇒ Boolean @@ -15517,7 +15772,7 @@

  • - .stringify_template_tokens(tokens) ⇒ Object + .readme_section_partials(project_root, config, readme) ⇒ Object @@ -15540,7 +15795,7 @@

  • - .strip_leading_decorative_graphemes(text) ⇒ Object + .readme_section_partials_for_render(readme_style, facts) ⇒ Object @@ -15563,7 +15818,7 @@

  • - .strip_orphaned_rake_task_requires(content) ⇒ Object + .readme_style_facts(project_root, config, license, template_profile: nil, repository: nil) ⇒ Object @@ -15586,7 +15841,7 @@

  • - .strip_readme_heading_adornment(text) ⇒ Object + .readme_template_tokens(facts) ⇒ Object @@ -15609,7 +15864,7 @@

  • - .sync_kettle_config_documentation_comments(content) ⇒ Object + .readme_top_logo_credit_separator(type) ⇒ Object @@ -15632,7 +15887,7 @@

  • - .sync_kettle_config_env_overrides(content, env) ⇒ Object + .readme_top_logo_default_alt(type, slug) ⇒ Object @@ -15655,7 +15910,7 @@

  • - .sync_kettle_config_gemspec_strategy_lines!(lines, gemspec_path, profile) ⇒ Object + .readme_top_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object @@ -15678,7 +15933,7 @@

  • - .sync_kettle_config_internal_values(content) ⇒ Object + .readme_top_logo_entries_with_asset_size(entries) ⇒ Object @@ -15701,7 +15956,7 @@

  • - .sync_kettle_config_monorepo_subgem_profile(content, gemspec_path, profile) ⇒ Object + .readme_top_logo_entry_from_config(logo, org:, gem_name:, repository: {}) ⇒ Object @@ -15724,7 +15979,7 @@

  • - .sync_readme_top_logos_documentation_comment(content) ⇒ Object + .readme_top_logo_entry_from_option(option, org:, gem_name:, repository: {}) ⇒ Object @@ -15747,7 +16002,7 @@

  • - .synchronize_github_actions_ci(_content, facts) ⇒ Object + .readme_top_logo_options(config) ⇒ Object @@ -15770,7 +16025,7 @@

  • - .synchronize_github_actions_coverage_ci(_content, facts) ⇒ Object + .readme_top_logo_refs(entries) ⇒ Object @@ -15793,7 +16048,7 @@

  • - .synchronize_github_actions_framework_ci(_content, facts) ⇒ Object + .readme_top_logo_row(entries) ⇒ Object @@ -15816,7 +16071,7 @@

  • - .synchronize_github_actions_framework_gemfile(target_path, facts) ⇒ Object + .readme_url_template_tokens(repository, package_name, github_org) ⇒ Object @@ -15839,7 +16094,7 @@

  • - .synchronize_github_actions_workflow_snippets(content) ⇒ Object + .readme_workflow_path_from_url(url) ⇒ Object @@ -15862,7 +16117,7 @@

  • - .synchronize_github_funding_yml(content, facts) ⇒ Object + .readme_workflow_paths(project_root) ⇒ Object @@ -15885,7 +16140,7 @@

  • - .synchronize_managed_block(content, facts) ⇒ Object + .recipe_decision_category(recipe) ⇒ Object @@ -15908,7 +16163,7 @@

  • - .synchronize_readme(content, facts, project_root: nil) ⇒ Object + .recipe_decision_diagnostics(recipe) ⇒ Object @@ -15931,7 +16186,7 @@

  • - .template_activation_config(config) ⇒ Object + .recipe_decision_evaluation(decision_policy:, recipe:, changed:, destination_existed:) ⇒ Object @@ -15954,7 +16209,7 @@

  • - .template_entries(project_root, root, templates) ⇒ Object + .recipe_default_action(recipe, changed:, destination_existed:) ⇒ Object @@ -15977,7 +16232,7 @@

  • - .template_entry_apply?(entry, apply_templates) ⇒ Boolean + .recipe_entry(name, target_path, provider_family, primitive, facts:, provider_backend: nil, selectors: []) ⇒ Object @@ -16000,7 +16255,7 @@

  • - .template_entry_paths(entry) ⇒ Object + .recipe_filter_patterns(template_selection) ⇒ Object @@ -16023,7 +16278,7 @@

  • - .template_file_strategy_config(config, target_path) ⇒ Object + .recipe_pack(facts) ⇒ Object @@ -16046,7 +16301,7 @@

  • - .template_file_type(recipe) ⇒ Object + .recipe_report_metadata(recipe) ⇒ Object @@ -16069,7 +16324,7 @@

  • - .template_inventory_entries(project_root, template_root_path) ⇒ Object + .recipe_report_phase(recipe_report) ⇒ Object @@ -16092,7 +16347,7 @@

  • - .template_inventory_target_path(project_root, logical_path) ⇒ Object + .recipe_run_stats(recipe_reports, diagnostics: []) ⇒ Object @@ -16115,7 +16370,7 @@

  • - .template_keep_destination_path?(config, target_path) ⇒ Boolean + .recipe_run_stats_summary(stats) ⇒ Object @@ -16138,7 +16393,7 @@

  • - .template_legacy_destination_cleanups(project_root, preferences) ⇒ Object + .recipe_runtime_context(recipe, facts, deletion) ⇒ Object @@ -16161,7 +16416,7 @@

  • - .template_manifest(project_root: Dir.pwd, template_root: nil, config: nil) ⇒ Object + .recipe_template_content(project_root, recipe) ⇒ Object @@ -16184,7 +16439,7 @@

  • - .template_obsolete_license_cleanups(project_root, config, preferences) ⇒ Object + .redundant_templating_guard_wrapper_node?(node) ⇒ Boolean @@ -16207,7 +16462,7 @@

  • - .template_pattern_strategy_config(config, target_path) ⇒ Object + .remove_duplicate_gemspec_assignments(content, receiver:, fields:) ⇒ Object @@ -16230,7 +16485,7 @@

  • - .template_root(project_root, templates) ⇒ Object + .remove_duplicate_simplecov_do_cov_bootstrap_blocks(content) ⇒ Object @@ -16253,7 +16508,7 @@

  • - .template_root_path(project_root = Dir.pwd, config: nil) ⇒ Object + .remove_duplicate_simplecov_requires(content) ⇒ Object @@ -16276,7 +16531,7 @@

  • - .template_runtime_config(config, facts, license: {}) ⇒ Object + .remove_empty_gemspec_development_dependency_section_headings(content, receiver:) ⇒ Object @@ -16299,7 +16554,7 @@

  • - .template_selection_for(env, run_options) ⇒ Object + .remove_gemfile_dependency_blocks(content, gem_names) ⇒ Object @@ -16322,7 +16577,7 @@

  • - .template_source_display_path(template_root, selected_source) ⇒ Object + .remove_gemfile_dependency_lines(content, gem_names) ⇒ Object @@ -16345,7 +16600,7 @@

  • - .template_source_preference(project_root, template_root, entry, config, opencollective_disabled: false, include_patterns: nil, apply_templates: false) ⇒ Object + .remove_gemfile_percent_w_entries(content, gem_names) ⇒ Object @@ -16368,7 +16623,7 @@

  • - .template_source_preferences(project_root, config, opencollective_disabled: false, include_patterns: nil) ⇒ Object + .remove_gemspec_assignment(content, receiver:, field:) ⇒ Object @@ -16391,7 +16646,7 @@

  • - .template_source_selection_reason(configured_source, selected_source) ⇒ Object + .remove_gemspec_dependency_lines(content, receiver:, names:, runtime_only: false) ⇒ Object @@ -16414,7 +16669,7 @@

  • - .template_strategy_config(config, target_path) ⇒ Object + .remove_gemspec_development_dependencies_already_runtime(content, receiver:) ⇒ Object @@ -16437,7 +16692,7 @@

  • - .template_strategy_entry(config, path, entry) ⇒ Object + .remove_gemspec_legacy_version_loader_preamble(content) ⇒ Object @@ -16460,7 +16715,7 @@

  • - .template_tokens(facts, funding) ⇒ Object + .remove_gemspec_self_dependency_lines(content, package_name, receiver:) ⇒ Object @@ -16483,7 +16738,7 @@

  • - .template_version_gem_bootstrap_step(project_root, report) ⇒ Object + .remove_gemspec_version_gem_dependency_when_non_default_entrypoint(content, facts, receiver:) ⇒ Object @@ -16506,7 +16761,7 @@

  • - .token_config_values(config) ⇒ Object + .remove_gemspec_version_gem_dependency_when_runtime_incompatible(content, facts, receiver:) ⇒ Object @@ -16529,7 +16784,7 @@

  • - .token_placeholder?(value) ⇒ Boolean + .remove_obsolete_simplecov_keep_destination_config(content) ⇒ Object @@ -16552,7 +16807,7 @@

  • - .toml_string_scalar_line_value(content, key) ⇒ Object + .remove_readme_badge_and_refs(content, badge_source, link_labels) ⇒ Object @@ -16575,7 +16830,7 @@

  • - .top_level_ruby_call_records(content, call_name) ⇒ Object + .remove_readme_sections(content, section_bases) ⇒ Object @@ -16598,7 +16853,7 @@

  • - .top_level_yaml_key_line?(line) ⇒ Boolean + .remove_ruby_comment_lines_containing(content, text) ⇒ Object @@ -16621,7 +16876,7 @@

  • - .trim_trailing_blank_lines(content) ⇒ Object + .remove_stale_generated_gemspec_homepage_replacement(replacements, destination_content, facts, receiver:) ⇒ Object @@ -16644,7 +16899,7 @@

  • - .uncomment_ruby_comment_line(comment_source) ⇒ Object + .remove_stale_main_gemfile_direct_sibling_block(content, template_content) ⇒ Object @@ -16667,7 +16922,7 @@

  • - .unresolved_template_scan?(recipe) ⇒ Boolean + .remove_top_level_yaml_key_lines(content, key) ⇒ Object @@ -16690,7 +16945,7 @@

  • - .update_github_actions_pins(content) ⇒ Object + .remove_version_gem_entrypoint_references(content) ⇒ Object @@ -16713,7 +16968,7 @@

  • - .valid_gem_version?(version) ⇒ Boolean + .remove_yaml_mapping_path(content, path) ⇒ Object @@ -16736,7 +16991,7 @@

  • - .validate_kettle_jem_config!(config) ⇒ Object + .remove_yaml_scalar_path(content, path) ⇒ Object @@ -16759,7 +17014,7 @@

  • - .version_gem_bootstrap_entrypoint_content(content, namespace:, entrypoint_require:) ⇒ Object + .render_thin_readme(facts, readme_style, original, preserve_config) ⇒ Object @@ -16782,7 +17037,7 @@

  • - .version_gem_bootstrap_step(project_root, facts) ⇒ Object + .replace_existing_markdown_managed_block(content, marker, replacement) ⇒ Object @@ -16805,7 +17060,7 @@

  • - .version_gem_bootstrap_step_for_paths(project_root, facts, manage_version_file: true, manage_signature_file: true) ⇒ Object + .replace_gemspec_assignment_sources(content, replacements, receiver:) ⇒ Object @@ -16828,7 +17083,7 @@

  • - .version_gem_class_eval_block(namespace) ⇒ Object + .replace_gemspec_version_assignment(content, receiver:, rhs:) ⇒ Object @@ -16851,7 +17106,7 @@

  • - .version_gem_class_eval_call?(call) ⇒ Boolean + .replace_github_workflow_action_pin_sha(line, sha) ⇒ Object @@ -16874,7 +17129,7 @@

  • - .version_gem_cleanup_step(project_root, facts) ⇒ Object + .replace_kettle_config_bootstrap_licenses(content, licenses) ⇒ Object @@ -16897,7 +17152,7 @@

  • - .version_gem_entrypoint_file_content(namespace:, entrypoint_require:) ⇒ Object + .replace_kettle_config_bootstrap_project_emoji(content, emoji) ⇒ Object @@ -16920,7 +17175,7 @@

  • - .version_gem_free_entrypoint_content(content, entrypoint_require:) ⇒ Object + .replace_local_gems_assignment(content, gems) ⇒ Object @@ -16943,7 +17198,7 @@

  • - .version_gem_require_insertion_index(content, after_version_gem: false) ⇒ Object + .replace_markdown_managed_block(content, marker, replacement) ⇒ Object @@ -16966,7 +17221,7 @@

  • - .version_gem_runtime_compatible?(facts) ⇒ Boolean + .replace_markdown_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object @@ -16989,7 +17244,7 @@

  • - .version_gem_signature_file_content(namespace:) ⇒ Object + .replace_markdown_with_ast_crispr(content, target, replacement) ⇒ Object @@ -17012,7 +17267,7 @@

  • - .version_gem_template_entries(gemspec_path) ⇒ Object + .replace_matching_gemspec_dependency_lines(content, destination_dependencies, receiver:) ⇒ Object @@ -17035,7 +17290,7 @@

  • - .version_gem_template_target_path(gemspec_path, source) ⇒ Object + .replace_record_ranges(content, records_by_line) ⇒ Object @@ -17058,7 +17313,7 @@

  • - .version_gem_template_target_path?(target_path) ⇒ Boolean + .replace_ruby_managed_block(content, replacement) ⇒ Object @@ -17081,7 +17336,7 @@

  • - .version_gem_template_target_path_for_project(project_root, gemspec_path, source) ⇒ Object + .replace_ruby_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object @@ -17104,7 +17359,7 @@

  • - .version_gem_template_tokens(facts) ⇒ Object + .replace_source_byte_range(content, start_offset, end_offset, replacement) ⇒ Object @@ -17127,7 +17382,7 @@

  • - .version_gem_version_file_content(existing_version:, namespace:, version:) ⇒ Object + .replace_source_offsets(content, replacements) ⇒ Object @@ -17150,7 +17405,7 @@

  • - .versioned_gem_name_parts(name) ⇒ Object + .replace_source_range_lines(content, start_line, end_line, replacement) ⇒ Object @@ -17173,7 +17428,7 @@

  • - .versioned_gem_name_update_candidate?(destination_name, template_name) ⇒ Boolean + .replace_text_managed_block(content, replacement) ⇒ Object @@ -17196,7 +17451,7 @@

  • - .workflow_job_env_existing_keys(lines, bundle_index, indent_length) ⇒ Object + .replace_text_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object @@ -17219,7 +17474,7 @@

  • - .workflow_matrix_env_indent(lines, mapping) ⇒ Object + .replace_toml_string_scalar_line(content, key, value) ⇒ Object @@ -17242,7 +17497,7 @@

  • - .workflow_matrix_env_insert_index(lines, mapping) ⇒ Object + .replace_yaml_node_lines(content, key, replacement) ⇒ Object @@ -17265,7 +17520,7 @@

  • - .workflow_recipe_slug(workflow_path) ⇒ Object + .replace_yaml_scalar_line(content, key, value) ⇒ Object @@ -17288,7 +17543,7 @@

  • - .wrap_ruby_namespace(namespace, body_lines) ⇒ Object + .replace_yaml_scalar_path(content, path, value) ⇒ Object @@ -17311,7 +17566,7 @@

  • - .write_if_changed(project_root, relative_path, content) ⇒ Object + .replacement_for_supported_gemspec_files_assignment(template_record:, destination_record:, template_receiver:) ⇒ Object @@ -17334,7 +17589,7 @@

  • - .yaml_config_scalar_literal(value, path:) ⇒ Object + .repository_facts(project_root, source_url, package_name:, repository_topology:) ⇒ Object @@ -17357,7 +17612,7 @@

  • - .yaml_contains_key_value?(node, key, value) ⇒ Boolean + .repository_monorepo_subproject?(repository) ⇒ Boolean @@ -17380,7 +17635,7 @@

  • - .yaml_double_quoted_scalar(value) ⇒ Object + .repository_name_from_source_url(source_url) ⇒ Object @@ -17403,7 +17658,7 @@

  • - .yaml_line_comment_suffix(line, key_index) ⇒ Object + .repository_project_logo_href(repository, slug:, org:, gem_name:) ⇒ Object @@ -17426,7 +17681,7 @@

  • - .yaml_mapping_nodes(content) ⇒ Object + .repository_project_logo_slug(repository, org:, gem_name:) ⇒ Object @@ -17449,7 +17704,7 @@

  • - .yaml_mapping_scalar_value(mapping, key) ⇒ Object + .repository_resource_urls(repository) ⇒ Object @@ -17472,7 +17727,7 @@

  • - .yaml_mapping_value_node(content, key, node_class) ⇒ Object + .repository_root_url(source_url) ⇒ Object @@ -17495,7 +17750,7 @@

  • - .yaml_merge_options(recipe) ⇒ Object + .repository_topology_for(config, env, template_selection) ⇒ Object @@ -17518,7 +17773,7 @@

  • - .yaml_process_result_adapter_failure?(merge_result) ⇒ Boolean + .required_ruby_version_rubocop_disable(min_ruby) ⇒ Object @@ -17541,7 +17796,7 @@

  • - .yaml_scalar_line_value(content, key) ⇒ Object + .resolve_template_tokens(content, tokens, scan_unresolved: true) ⇒ Object @@ -17564,7 +17819,7 @@

  • - .yaml_scalar_pairs(content) ⇒ Object + .resolve_uncommitted_author!(project_root, author_map) ⇒ Object @@ -17587,7 +17842,7 @@

  • - .yaml_scalar_path_entries(content) ⇒ Object + .resolved_licenses(config, gemspec_licenses) ⇒ Object @@ -17610,7 +17865,7 @@

  • - .yaml_top_level_key_lines(content) ⇒ Object + .retired_gemspec_development_dependency_key?(key) ⇒ Boolean @@ -17630,476 +17885,15890 @@

  • - +
  • + + + .rewrite_gemspec_version_loader(content, facts:) ⇒ Object - - - - -
    -

    Class Method Details

    -
    -

    + + + + - .active_license_basenames(config) ⇒ Object - - -

    - - - - -
    -
     
    +  
    +    
    +
    + + -10549 -10550 -10551 -10552 -10553 -10554
    -
    -
    # File 'lib/kettle/jem.rb', line 10549
    +      
    +        
  • + + + .rewrite_markdown_reference_links(content, links) ⇒ Object + -def active_license_basenames(config) - Array(config["resolved_licenses"]) - .map { |license| spdx_basename(license) } - .reject(&:empty?) - .to_set -end
  • -
    -
    -
    -

    + + + + - .actual_changed_files_after_apply(project_root, changed_files, before_apply_files) ⇒ Object - - -

    - - - - -
    -
     
    +  
    +    
    +
    + + -3139 -3140 -3141 -3142 -3143 -3144 -3145 -3146 -3147 -3148 -3149
    -
    -
    # File 'lib/kettle/jem.rb', line 3139
    +      
    +        
  • + + + .rubocop_target_ruby_token(min_ruby) ⇒ Object + -def actual_changed_files_after_apply(project_root, changed_files, before_apply_files) - changed_files.filter_map do |relative_path| - path = File.join(project_root, relative_path) - original = before_apply_files.fetch(relative_path, nil) - if File.exist?(path) - (File.read(path) == original) ? nil : relative_path - else - original.nil? ? nil : relative_path - end - end.uniq.sort -end
  • -
    -
    -
    -

    + + + + - .add_framework_matrix_job_env(content, keys) ⇒ Object - - -

    - - - - -
    -
    -
    -
    -4991
    -4992
    -4993
    -4994
    -4995
    -4996
    -4997
    -4998
    -4999
    -5000
    -5001
    -5002
    -5003
    -5004
    -5005
    -5006
    -
    -
    # File 'lib/kettle/jem.rb', line 4991
     
    -def add_framework_matrix_job_env(content, keys)
    -  lines = content.lines
    -  bundle_index = lines.index { |line| line.match?(/\A\s+BUNDLE_GEMFILE:/) }
    -  return content unless bundle_index
    +  
    +    
    +
    + + - indent = lines.fetch(bundle_index).match(/\A(\s*)/)[1] - existing = workflow_job_env_existing_keys(lines, bundle_index, indent.length) - additions = keys.map(&:to_s).sort.reject { |key| existing.include?(key) } - return content if additions.empty? + +
  • + + + .rubocop_template_tokens(min_ruby, ruby_style: {}) ⇒ Object + - lines.insert( - bundle_index + 1, - *additions.map { |key| %(#{indent}#{key}: ${{ matrix.#{key} || '' }}\n) } - ) - lines.join -end
  • -
    -
    -
    -

    + + + + - .add_monorepo_root_file_overrides(content) ⇒ Object - - -

    - - - - -
    -
     
    +  
    +    
    +
    + + -6961 -6962 -6963 -6964 -6965 -6966 -6967 -6968 -6969 -6970 -6971
    -
    -
    # File 'lib/kettle/jem.rb', line 6961
    +      
    +        
  • + + + .rubocop_tokens_for(min_ruby) ⇒ Object + -def add_monorepo_root_file_overrides(content) - override_lines = MONOREPO_ROOT_TEMPLATE_ENTRIES.reject { |entry| entry.to_s.include?("/") }.flat_map do |entry| - kettle_config_file_override_lines(entry, monorepo_root_file_strategy(entry)) - end - insert_after_line_sequence( - content, - ["files:"], - override_lines.join("\n"), - "Could not apply monorepo-root file overrides to .kettle-jem.yml bootstrap template" - ) -end
  • -
    -
    -
    -

    + + + + - .add_monorepo_subgem_file_overrides(content, gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE) ⇒ Object - - -

    - - - - -
    -
     
    +  
    +    
    +
    + + -7049 -7050 -7051 -7052 -7053 -7054 -7055 -7056 -7057 -7058 -7059 -7060 -7061 -7062 -7063 -7064 -7065 -7066 -7067 -7068
    -
    -
    # File 'lib/kettle/jem.rb', line 7049
    +      
    +        
  • + + + .ruby_appraisal_name_version(name) ⇒ Object + -def add_monorepo_subgem_file_overrides(content, gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE) - override_lines = [ - " README.md:", - " strategy: merge" - ] - gemspec = gemspec_path.to_s.strip - unless gemspec.empty? - gemspec_strategy = (normalize_template_profile(profile) == MONOREPO_SUBGEM_RELEASE_TEMPLATE_PROFILE) ? "merge" : "keep_destination" - override_lines.concat([ - " #{gemspec}:", - " strategy: #{gemspec_strategy}" - ]) - end - insert_after_line_sequence( - content, - ["files:"], - override_lines.join("\n"), - "Could not apply monorepo-subgem file overrides to .kettle-jem.yml bootstrap template" - ) -end
  • -
    -
    -
    -

    + + + + - .aliased_readme_destination_section(template_base, destination_lookup, preserve_config) ⇒ Object - - -

    - - - - -
    -
     
    +  
    +    
    +
    + + -10148 -10149 -10150 -10151 -10152 -10153 -10154
    -
    -
    # File 'lib/kettle/jem.rb', line 10148
    +      
    +        
  • + + + .ruby_appraisal_names_below(content, min_ruby) ⇒ Object + -def aliased_readme_destination_section(template_base, destination_lookup, preserve_config) - aliases = preserve_config[:aliases] || README_SECTION_ALIASES - aliases.each do |from, to| - return destination_lookup[from] if to == template_base && destination_lookup.key?(from) - end - nil -end
  • -
    -
    -
    -

    + + + + - .append_gemfile_comment_block(lines, block) ⇒ Object - - -

    - - - - -
    -
     
    +  
    +    
    +
    + + -5266 -5267 -5268 -5269 -5270
    -
    -
    # File 'lib/kettle/jem.rb', line 5266
    +      
    +        
  • + + + .ruby_array_literal(values) ⇒ Object + -def append_gemfile_comment_block(lines, block) - first_line = block.first - lines.pop while first_line && lines.last == first_line - lines.concat(block) -end
  • -
    -
    -
    -

    + + + + + - .append_github_actions_coverage_steps(content) ⇒ Object - -

    - - - - -
    -
    +    
    +
    + + + +
  • + + + .ruby_bucket_path_segment?(segment) ⇒ Boolean + -11396 -11397 -11398 -11399 -11400 -11401 -11402 -11403 -11404 -11405 -11406
  • -
    -
    # File 'lib/kettle/jem.rb', line 11396
    +    
    +  
    +  
    +  
    +  
    +  
    +  
    +  
    +  
     
    -def append_github_actions_coverage_steps(content)
    -  return content if content.include?("Upload coverage to Coveralls") || content.include?("Upload coverage to CodeCov")
    +  
    +    
    +
    + + - lines = content.lines - steps_sequence = yaml_mapping_value_node(content, "steps", Psych::Nodes::Sequence) - return content unless steps_sequence + +
  • + + + .ruby_call_records(content, call_name) ⇒ Object + - insert_index = steps_sequence.end_line - lines.insert(insert_index, "#{github_actions_coverage_steps}\n") - lines.join -end
  • -
    -
    -
    -

    + + + + + - .append_missing_gemspec_dependency_lines(content, destination_dependencies, receiver:) ⇒ Object - -

    - - - - -
    -
    +    
    +
    + + + +
  • + + + .ruby_constant_path_segments(node) ⇒ Object + -6388 -6389 -6390 -6391 -6392 -6393 -6394 -6395 -6396 -6397 -6398 -6399 -6400 -6401
  • -
    -
    # File 'lib/kettle/jem.rb', line 6388
    +    
    +  
    +  
    +  
    +  
    +  
    +  
    +  
    +  
     
    -def append_missing_gemspec_dependency_lines(content, destination_dependencies, receiver:)
    -  existing_keys = gemspec_dependency_line_index(content, receiver: receiver).keys
    -  missing_lines = destination_dependencies.except(*existing_keys).values
    -  return content if missing_lines.empty?
    +  
    +    
    +
    + + - runtime_lines, development_lines = missing_lines.partition do |line| - key = gemspec_dependency_line_key(line, receiver: receiver) - key && key.first != "add_development_dependency" - end + +
  • + + + .ruby_double_quoted_string_body(value) ⇒ Object + - merged = content.to_s - merged = insert_missing_runtime_gemspec_dependency_lines(merged, runtime_lines, receiver: receiver) - insert_missing_development_gemspec_dependency_lines(merged, development_lines) -end
  • -
    -
    -
    - - - + +
    -
     
    +  
    +    
    +
    + + + + +
  • + + + .ruby_engines_config(config) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_entrypoint_module_namespace(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_entrypoint_module_namespace_for(node, namespace) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_first_simple_quoted_string_node(node) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_first_string_argument(owner) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_keyword_argument_node(call, key) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_keyword_string_argument(call, key) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_local_word_array_assignments(root) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_merge_options(recipe, merge_template_requires:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_method_move_policy(recipe) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_multiline_word_array_source(names, indent:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_node_source_end_line(node) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_project_version_constant_path?(node, namespace:) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_project_version_embedded_statements?(node, namespace:) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_project_version_interpolated_string_source(node, receiver:, namespace:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_require_aliases(recipe, facts = nil) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_require_call?(owner, method_name, argument) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_simple_quoted_string_node?(node) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_static_interpolated_string_value(node) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_static_string_array_value(node, local_word_arrays = {}) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_static_string_call_value(node) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_static_string_value(node) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_string_argument(call) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_string_argument_at(call, index) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_string_arguments(call) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_style_facts(project_root) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_style_template_tokens(ruby_style) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_template_policy_report(recipe:, request:, original:, final:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_top_level_require?(content, method_name, argument) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_top_level_require_records(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_version_class_eval_namespaces(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_version_constant_value(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_version_module_namespace(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_version_module_namespace_for(node, namespace) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_word_array_names(node) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_word_array_node?(node) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_word_array_nodes(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .ruby_word_array_records(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .run_apply_phases(project_root, report) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .runtime_context_value(request, *path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .runtime_gemspec_dependency_insertion_index(lines, receiver:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .runtime_workspace_override_records(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .security_supported_version_token(version) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .selected_template_path?(relative_path, patterns) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .semantic_readme_heading(text) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .set_template_file_strategy!(config, target_path, strategy) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .setup_execution_context(env, run_options) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .setup_guidance_diagnostic(config_existed:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .setup_project(project_root, env: ENV, run_options: {}, command_runner: nil) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shield_token(value) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shim_facts(config, env, run_options, package_name:, entrypoint_require:, template_profile:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shim_profile_cleanups(project_root, facts, preferences, template_selection: {}) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shim_replacement_namespace(replacement_require) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shim_template_entries(facts, config) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shim_template_entries_for_config(gemspec_path, config) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shim_template_profile?(facts) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shim_template_tokens(shim) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shim_version_file_content(namespace:, replacement_namespace:, replacement_require:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shunted_dependency_has_floor_compatible_version?(resolver, dependency, versions, floor) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shunted_dependency_has_modular_override?(project_root, dependency) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shunted_effective_floor(min_ruby) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shunted_gemfile_block(gemspec, facts, run_options) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .shunted_gemfile_managed_block(dependencies) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_config_require_call_node?(node) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_config_require_call_nodes(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_config_require_call_records(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_do_cov_bootstrap_complete_node?(node) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_do_cov_bootstrap_only_node?(node) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_do_cov_bootstrap_records(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_do_cov_predicate_node?(node) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_kettle_soup_cover_require_call_node?(node) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_obsolete_call_nodes(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_require_call_node?(node) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_require_call_records(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_start_call_node?(node) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_start_call_nodes(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .simplecov_track_files_call_records(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .skip_disabled_integration_template?(target_path, config) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .skip_packaged_gemfile_template?(target_path, config) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .skip_packaged_license_template?(target_path, config) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .skip_packaged_workflow_template?(target_path, config, include_patterns: nil) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .skywalking_eyes_disabled_by_default?(config, license, disabled) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .snapshot_changed_files(project_root, changed_files) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .social_facts(config, env) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .social_template_tokens(social) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .social_token_value(social_config, env, key) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .sort_runtime_gemspec_dependency_lines(content, receiver:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .source_blob_url(source_url, path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .source_tree_url(source_url, path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .spdx_basename(spdx_id) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .spdx_from_basename(basename) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .spec_helper_simplecov_do_cov_bootstrap_source(indent) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .stale_generated_gemspec_files_group?(group) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .stale_generated_gemspec_splat_key?(key) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .stale_github_workflow_template_pin_records(relative_path, final_content, destination_content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .stale_versioned_engine_workflow?(relative_path) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .standard_test_appraisal_names(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .static_gemspec_metadata_assignment(content, key) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .static_gemspec_metadata_key_assigned?(content, key) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .static_project_gemspec_metadata(gemspec_path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .step_event_mark(step) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .step_report_metadata(recipe, deletion) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .stringify_template_tokens(tokens) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .strip_leading_decorative_graphemes(text) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .strip_orphaned_rake_task_requires(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .strip_readme_heading_adornment(text) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .sync_kettle_config_documentation_comments(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .sync_kettle_config_env_overrides(content, env) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .sync_kettle_config_gemspec_strategy_lines!(lines, gemspec_path, profile) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .sync_kettle_config_internal_values(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .sync_kettle_config_monorepo_subgem_profile(content, gemspec_path, profile) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .sync_readme_top_logos_documentation_comment(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .synchronize_github_actions_ci(content, facts) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .synchronize_github_actions_coverage_ci(content, facts) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .synchronize_github_actions_framework_ci(content, facts) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .synchronize_github_actions_framework_gemfile(target_path, facts) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .synchronize_github_actions_workflow_snippets(content, facts: {}) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .synchronize_github_funding_yml(content, facts) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .synchronize_managed_block(content, facts) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .synchronize_readme(content, facts, project_root: nil) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_activation_config(config) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_entries(project_root, root, templates) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_entry_apply?(entry, apply_templates) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_entry_paths(entry) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_file_strategy_config(config, target_path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_file_type(recipe) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_inventory_entries(project_root, template_root_path, templates: {}) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_inventory_target_path(project_root, logical_path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_keep_destination_path?(config, target_path) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_legacy_destination_cleanups(project_root, preferences) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_manifest(project_root: Dir.pwd, template_root: nil, config: nil) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_obsolete_license_cleanups(project_root, config, preferences) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_pattern_strategy_config(config, target_path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_root(project_root, templates) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_root_path(project_root = Dir.pwd, config: nil) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_runtime_config(config, facts, license: {}) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_selection_for(env, run_options) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_source_display_path(template_root, selected_source) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_source_preference(project_root, template_root, entry, config, opencollective_disabled: false, include_patterns: nil, apply_templates: false) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_source_preferences(project_root, config, opencollective_disabled: false, include_patterns: nil) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_source_selection_reason(configured_source, selected_source) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_strategy_config(config, target_path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_strategy_entry(config, path, entry) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_tokens(facts, funding) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .template_version_gem_bootstrap_step(project_root, report) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .templating_guard_records(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .token_config_values(config) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .token_placeholder?(value) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .toml_string_scalar_line_value(content, key) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .top_level_ruby_call_records(content, call_name) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .top_level_yaml_key_line?(line) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .trim_trailing_blank_lines(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .truthy_config?(value) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .uncomment_ruby_comment_line(comment_source) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .unresolved_template_scan?(recipe) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .update_github_actions_pins(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .valid_gem_version?(version) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .validate_kettle_jem_config!(config) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_bootstrap_entrypoint_content(content, namespace:, entrypoint_require:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_bootstrap_step(project_root, facts) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_bootstrap_step_for_paths(project_root, facts, manage_version_file: true, manage_signature_file: true) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_class_eval_block(namespace) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_class_eval_call?(call) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_cleanup_step(project_root, facts) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_entrypoint_file_content(namespace:, entrypoint_require:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_facts_for_project(project_root, entrypoint_require) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_free_entrypoint_content(content, entrypoint_require:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_require_insertion_index(content, after_version_gem: false) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_runtime_compatible?(facts) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_signature_file_content(namespace:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_template_entries(gemspec_path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_template_target_path(gemspec_path, source) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_template_target_path?(target_path) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_template_target_path_for_project(project_root, gemspec_path, source) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_template_tokens(facts) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_gem_version_file_content(existing_version:, namespace:, version:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .version_spec_require_insertion_index(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .versioned_gem_name_parts(name) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .versioned_gem_name_update_candidate?(destination_name, template_name) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .with_event_phase(events, phase, payload = {}) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .workflow_job_env_existing_keys(lines, bundle_index, indent_length) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .workflow_matrix_env_indent(lines, mapping) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .workflow_matrix_env_insert_index(lines, mapping) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .workflow_recipe_slug(workflow_path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .wrap_ruby_namespace(namespace, body_lines) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .write_consolidated_version_signature(project_root, signature_path, legacy_signature_paths, namespace:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .write_if_changed(project_root, relative_path, content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_config_scalar_literal(value, path:) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_contains_key_value?(node, key, value) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_double_quoted_scalar(value) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_line_comment_suffix(line, key_index) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_mapping_nodes(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_mapping_path_entries(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_mapping_scalar_value(mapping, key) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_mapping_value_node(content, key, node_class) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_merge_options(recipe) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_process_result_adapter_failure?(merge_result) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_scalar_line_value(content, key) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_scalar_pairs(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_scalar_path_entries(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_scalar_sequence_at_path(content, path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .yaml_top_level_key_lines(content) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + + + + + + + +
    +

    Class Method Details

    + + +
    +

    + + .active_license_basenames(config) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +13560
    +13561
    +13562
    +13563
    +13564
    +13565
    +
    +
    # File 'lib/kettle/jem.rb', line 13560
    +
    +def active_license_basenames(config)
    +  Array(config["resolved_licenses"])
    +    .map { |license| spdx_basename(license) }
    +    .reject(&:empty?)
    +    .to_set
    +end
    +
    +
    + +
    +

    + + .actual_changed_files_after_apply(project_root, changed_files, before_apply_files) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3648
    +3649
    +3650
    +3651
    +3652
    +3653
    +3654
    +3655
    +3656
    +3657
    +3658
    +
    +
    # File 'lib/kettle/jem.rb', line 3648
    +
    +def actual_changed_files_after_apply(project_root, changed_files, before_apply_files)
    +  changed_files.filter_map do |relative_path|
    +    path = File.join(project_root, relative_path)
    +    original = before_apply_files.fetch(relative_path, nil)
    +    if File.exist?(path)
    +      (File.read(path) == original) ? nil : relative_path
    +    else
    +      original.nil? ? nil : relative_path
    +    end
    +  end.uniq.sort
    +end
    +
    +
    + +
    +

    + + .adapter_failure_template_source_error(file_type, recipe) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +6385
    +6386
    +6387
    +
    +
    # File 'lib/kettle/jem.rb', line 6385
    +
    +def adapter_failure_template_source_error(file_type, recipe)
    +  ArgumentError.new("failed to merge #{file_type} template #{recipe.fetch(:target_path)}: provider adapter failure")
    +end
    +
    +
    + +
    +

    + + .add_framework_matrix_job_env(content, keys) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +6288
    +6289
    +6290
    +6291
    +6292
    +6293
    +6294
    +6295
    +6296
    +6297
    +6298
    +6299
    +6300
    +6301
    +6302
    +6303
    +
    +
    # File 'lib/kettle/jem.rb', line 6288
    +
    +def add_framework_matrix_job_env(content, keys)
    +  lines = content.lines
    +  bundle_index = lines.index { |line| line.match?(/\A\s+BUNDLE_GEMFILE:/) }
    +  return content unless bundle_index
    +
    +  indent = lines.fetch(bundle_index).match(/\A(\s*)/)[1]
    +  existing = workflow_job_env_existing_keys(lines, bundle_index, indent.length)
    +  additions = keys.map(&:to_s).sort.reject { |key| existing.include?(key) }
    +  return content if additions.empty?
    +
    +  lines.insert(
    +    bundle_index + 1,
    +    *additions.map { |key| %(#{indent}#{key}: ${{ matrix.#{key} || '' }}\n) }
    +  )
    +  lines.join
    +end
    +
    +
    + +
    +

    + + .add_monorepo_root_file_overrides(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +9243
    +9244
    +9245
    +9246
    +9247
    +9248
    +9249
    +9250
    +9251
    +9252
    +9253
    +
    +
    # File 'lib/kettle/jem.rb', line 9243
    +
    +def add_monorepo_root_file_overrides(content)
    +  override_lines = MONOREPO_ROOT_TEMPLATE_ENTRIES.reject { |entry| entry.to_s.include?("/") }.flat_map do |entry|
    +    kettle_config_file_override_lines(entry, monorepo_root_file_strategy(entry))
    +  end
    +  insert_after_line_sequence(
    +    content,
    +    ["files:"],
    +    override_lines.join("\n"),
    +    "Could not apply monorepo-root file overrides to .kettle-jem.yml bootstrap template"
    +  )
    +end
    +
    +
    + +
    +

    + + .add_monorepo_subgem_file_overrides(content, gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +9331
    +9332
    +9333
    +9334
    +9335
    +9336
    +9337
    +9338
    +9339
    +9340
    +9341
    +9342
    +9343
    +9344
    +9345
    +9346
    +9347
    +9348
    +9349
    +9350
    +
    +
    # File 'lib/kettle/jem.rb', line 9331
    +
    +def add_monorepo_subgem_file_overrides(content, gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE)
    +  override_lines = [
    +    "  README.md:",
    +    "    strategy: merge"
    +  ]
    +  gemspec = gemspec_path.to_s.strip
    +  unless gemspec.empty?
    +    gemspec_strategy = (normalize_template_profile(profile) == MONOREPO_SUBGEM_RELEASE_TEMPLATE_PROFILE) ? "merge" : "keep_destination"
    +    override_lines.concat([
    +      "  #{gemspec}:",
    +      "    strategy: #{gemspec_strategy}"
    +    ])
    +  end
    +  insert_after_line_sequence(
    +    content,
    +    ["files:"],
    +    override_lines.join("\n"),
    +    "Could not apply monorepo-subgem file overrides to .kettle-jem.yml bootstrap template"
    +  )
    +end
    +
    +
    + +
    +

    + + .add_shim_bootstrap_config(content, shim) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +9158
    +9159
    +9160
    +9161
    +9162
    +9163
    +9164
    +9165
    +9166
    +9167
    +9168
    +9169
    +9170
    +9171
    +9172
    +9173
    +9174
    +9175
    +9176
    +9177
    +9178
    +9179
    +
    +
    # File 'lib/kettle/jem.rb', line 9158
    +
    +def add_shim_bootstrap_config(content, shim)
    +  replacement_gem = shim[:replacement_gem].to_s
    +  replacement_require = shim[:replacement_require].to_s
    +  legacy_requires = Array(shim[:legacy_requires]).map(&:to_s).reject(&:empty?)
    +  block = [
    +    "shim:",
    +    "  replacement_gem: #{replacement_gem}",
    +    "  replacement_require: #{replacement_require}"
    +  ]
    +  unless legacy_requires.empty?
    +    block << "  legacy_requires:"
    +    block.concat(legacy_requires.map { |path| "    - #{path}" })
    +  end
    +  block << "  version:"
    +  block << "    strategy: shim"
    +  insert_after_line_sequence(
    +    content,
    +    ["homepage_uri: \"{KJ|HOMEPAGE_URI}\""],
    +    ["", *block].join("\n"),
    +    "Could not add shim config to .kettle-jem.yml bootstrap template"
    +  )
    +end
    +
    +
    + +
    +

    + + .add_shim_file_overrides(content, gemspec_path) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +9370
    +9371
    +9372
    +9373
    +9374
    +9375
    +9376
    +9377
    +9378
    +9379
    +9380
    +9381
    +9382
    +9383
    +
    +
    # File 'lib/kettle/jem.rb', line 9370
    +
    +def add_shim_file_overrides(content, gemspec_path)
    +  override_lines = shim_template_entries_for_config(gemspec_path, {}).flat_map do |entry|
    +    target = entry.fetch("target")
    +    next [] if target == KETTLE_CONFIG_PATH
    +
    +    kettle_config_file_override_lines(target, "accept_template")
    +  end
    +  insert_after_line_sequence(
    +    content,
    +    ["files:"],
    +    override_lines.join("\n"),
    +    "Could not apply shim file overrides to .kettle-jem.yml bootstrap template"
    +  )
    +end
    +
    +
    + +
    +

    + + .aliased_readme_destination_section(template_base, destination_lookup, preserve_config) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +13096
    +13097
    +13098
    +13099
    +13100
    +13101
    +13102
    +
    +
    # File 'lib/kettle/jem.rb', line 13096
    +
    +def aliased_readme_destination_section(template_base, destination_lookup, preserve_config)
    +  aliases = preserve_config[:aliases] || README_SECTION_ALIASES
    +  aliases.each do |from, to|
    +    return destination_lookup[from] if to == template_base && destination_lookup.key?(from)
    +  end
    +  nil
    +end
    +
    +
    + +
    +

    + + .append_gemfile_comment_block(lines, block) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +6588
    +6589
    +6590
    +6591
    +6592
    +
    +
    # File 'lib/kettle/jem.rb', line 6588
    +
    +def append_gemfile_comment_block(lines, block)
    +  first_line = block.first
    +  lines.pop while first_line && lines.last == first_line
    +  lines.concat(block)
    +end
    +
    +
    + +
    +

    + + .append_github_actions_coverage_steps(content, disabled_integrations: []) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14513
    +14514
    +14515
    +14516
    +14517
    +14518
    +14519
    +14520
    +14521
    +14522
    +14523
    +14524
    +14525
    +14526
    +
    +
    # File 'lib/kettle/jem.rb', line 14513
    +
    +def append_github_actions_coverage_steps(content, disabled_integrations: [])
    +  return content if content.include?("Upload coverage to Coveralls") ||
    +    content.include?("Upload coverage to QLTY") ||
    +    content.include?("Upload coverage to CodeCov") ||
    +    content.include?("Code Coverage Summary Report")
    +
    +  lines = content.lines
    +  steps_sequence = yaml_mapping_value_node(content, "steps", Psych::Nodes::Sequence)
    +  return content unless steps_sequence
    +
    +  insert_index = steps_sequence.end_line
    +  lines.insert(insert_index, "#{github_actions_coverage_steps(disabled_integrations: disabled_integrations)}\n")
    +  lines.join
    +end
    +
    +
    + +
    +

    + + .append_missing_gemspec_dependency_lines(content, destination_dependencies, receiver:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +8508
    +8509
    +8510
    +8511
    +8512
    +8513
    +8514
    +8515
    +8516
    +8517
    +8518
    +8519
    +8520
    +8521
    +
    +
    # File 'lib/kettle/jem.rb', line 8508
    +
    +def append_missing_gemspec_dependency_lines(content, destination_dependencies, receiver:)
    +  existing_keys = gemspec_dependency_line_index(content, receiver: receiver).keys
    +  missing_lines = destination_dependencies.except(*existing_keys).values
    +  return content if missing_lines.empty?
    +
    +  runtime_lines, development_lines = missing_lines.partition do |line|
    +    key = gemspec_dependency_line_key(line, receiver: receiver)
    +    key && key.first != "add_development_dependency"
    +  end
    +
    +  merged = content.to_s
    +  merged = insert_missing_runtime_gemspec_dependency_lines(merged, runtime_lines, receiver: receiver)
    +  insert_missing_development_gemspec_dependency_lines(merged, development_lines)
    +end
    +
    +
    + +
    + + + + + +
    +
    +
    +
    +5299
    +5300
    +5301
    +5302
    +5303
    +5304
    +5305
    +5306
    +5307
    +5308
    +5309
    +5310
    +5311
    +
    +
    # File 'lib/kettle/jem.rb', line 5299
    +
    +def append_missing_markdown_link_definitions(content, definitions)
    +  ensure_runtime_dependencies!
    +  existing = Ast::Crispr::Markdown::Markly.document_context(
    +    content: content,
    +    source_label: "README.md"
    +  ).structural_owners(owner_scope: :link_definitions).map { |owner| owner.label.to_s }
    +  missing_sources = definitions.reject { |owner| existing.include?(owner.label.to_s) }.map do |owner|
    +    owner.source.to_s.end_with?("\n") ? owner.source.to_s : "#{owner.source}\n"
    +  end
    +  return content if missing_sources.empty?
    +
    +  [content.to_s.rstrip, "", missing_sources.join.rstrip, ""].join("\n")
    +end
    +
    +
    + +
    + + + + + +
    +
    +
    +
    +5313
    +5314
    +5315
    +5316
    +5317
    +5318
    +5319
    +5320
    +5321
    +5322
    +5323
    +5324
    +5325
    +
    +
    # File 'lib/kettle/jem.rb', line 5313
    +
    +def append_used_markdown_link_definitions(content, definition_source)
    +  existing = ReadmePostProcessor.markdown_link_definition_owners(content).map { |owner| owner.label.to_s }.to_set
    +  referenced = ReadmePostProcessor.markdown_inline_reference_owners(content).flat_map(&:labels).map(&:to_s).to_set
    +  available = ReadmePostProcessor.markdown_link_definition_owners(definition_source).to_h do |owner|
    +    [owner.label.to_s, owner]
    +  end
    +  missing = referenced.filter_map do |label|
    +    next if existing.include?(label)
    +
    +    available[label]
    +  end
    +  append_missing_markdown_link_definitions(content, missing)
    +end
    +
    +
    + +
    +

    + + .apply_changelog_transfer_entries(content, entries) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4411
    +4412
    +4413
    +4414
    +4415
    +4416
    +4417
    +4418
    +4419
    +4420
    +4421
    +4422
    +4423
    +4424
    +4425
    +4426
    +4427
    +4428
    +4429
    +4430
    +4431
    +4432
    +4433
    +4434
    +4435
    +4436
    +4437
    +4438
    +4439
    +4440
    +
    +
    # File 'lib/kettle/jem.rb', line 4411
    +
    +def apply_changelog_transfer_entries(content, entries)
    +  transfer_entries = Array(entries).select do |entry|
    +    entry.is_a?(Hash) && entry[:key].to_s != "" && Array(entry[:lines]).any?
    +  end
    +  return ensure_trailing_newline(content) if transfer_entries.empty?
    +
    +  normalized = normalize_changelog(content, {})
    +  existing_keys = changelog_transfer_keys(normalized)
    +  missing = transfer_entries.reject { |entry| existing_keys.include?(entry.fetch(:key)) }
    +  return ensure_trailing_newline(normalized) if missing.empty?
    +
    +  lines = markdown_source_lines(normalized)
    +  unreleased = changelog_unreleased_line_index(lines)
    +  return ensure_trailing_newline(normalized) unless unreleased
    +
    +  destination_end = changelog_unreleased_end_index(lines, unreleased)
    +  destination_body = lines[(unreleased + 1)...destination_end] || []
    +  items = changelog_unreleased_items(destination_body)
    +  items["### Changed"] ||= []
    +  items["### Changed"].pop while items["### Changed"].any? && items["### Changed"].last.to_s.strip.empty?
    +  items["### Changed"] << "" if items["### Changed"].any?
    +  missing.each do |entry|
    +    items["### Changed"].concat(Array(entry.fetch(:lines)).map(&:rstrip))
    +  end
    +
    +  merged_lines = lines[0...unreleased] +
    +    build_changelog_unreleased_section(lines.fetch(unreleased), items) +
    +    lines[destination_end..].to_a
    +  ensure_trailing_newline(merged_lines.join("\n").gsub(/\n{3,}/, "\n\n"))
    +end
    +
    +
    + +
    +

    + + .apply_commented_gem_dependency_policy(template_content, content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +6550
    +6551
    +6552
    +6553
    +6554
    +6555
    +6556
    +6557
    +6558
    +6559
    +6560
    +6561
    +6562
    +6563
    +6564
    +6565
    +6566
    +6567
    +6568
    +6569
    +6570
    +6571
    +6572
    +6573
    +6574
    +6575
    +6576
    +6577
    +6578
    +6579
    +6580
    +6581
    +6582
    +6583
    +6584
    +6585
    +6586
    +
    +
    # File 'lib/kettle/jem.rb', line 6550
    +
    +def apply_commented_gem_dependency_policy(template_content, content)
    +  commented_blocks = commented_gem_dependency_blocks(template_content)
    +  return content if commented_blocks.empty?
    +
    +   = gemfile_gem_call_records(content)
    +    .select { |record| commented_blocks.key?(record.fetch(:name)) }
    +    .to_h { |record| [record.fetch(:start_line), record] }
    +   = commented_gem_dependency_block_records(content)
    +    .select { |record| commented_blocks.key?(record.fetch(:name)) }
    +    .to_h { |record| [record.fetch(:block_start_line), record] }
    +  inserted = Set.new
    +  skip_until = 0
    +  lines = []
    +  content.to_s.lines.each_with_index do |line, index|
    +    line_number = index + 1
    +    next if line_number < skip_until
    +
    +    if (record = [line_number])
    +      gem_name = record.fetch(:name)
    +      append_gemfile_comment_block(lines, commented_blocks.fetch(gem_name)) unless inserted.include?(gem_name)
    +      inserted << gem_name
    +      skip_until = record.fetch(:block_end_line) + 1
    +      next
    +    end
    +
    +    if (record = [line_number])
    +      gem_name = record.fetch(:name)
    +      append_gemfile_comment_block(lines, commented_blocks.fetch(gem_name)) unless inserted.include?(gem_name)
    +      inserted << gem_name
    +      skip_until = record.fetch(:end_line) + 1
    +      next
    +    end
    +
    +    lines << line
    +  end
    +  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
    +end
    +
    +
    + +
    +

    + + .apply_configured_gemspec_licenses(content, facts, receiver:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +7527
    +7528
    +7529
    +7530
    +7531
    +7532
    +7533
    +7534
    +7535
    +7536
    +7537
    +7538
    +7539
    +
    +
    # File 'lib/kettle/jem.rb', line 7527
    +
    +def apply_configured_gemspec_licenses(content, facts, receiver:)
    +  licenses = Array(facts&.dig(:license, :spdx)).map { |license| license.to_s.strip }.reject(&:empty?)
    +  return content if licenses.empty?
    +
    +  replacement = "#{receiver}.licenses = #{licenses.inspect}"
    +  existing = gemspec_assignment_records(content, receiver: receiver).find { |record| record.fetch(:field) == "licenses" }
    +  return replace_source_range_lines(content, existing.fetch(:start_line), existing.fetch(:end_line), "#{leading_whitespace(existing.fetch(:source))}#{replacement}\n") if existing
    +
    +  homepage = gemspec_assignment_records(content, receiver: receiver).find { |record| record.fetch(:field) == "homepage" }
    +  return insert_lines_after(content, homepage.fetch(:end_line), "  #{replacement}\n") if homepage
    +
    +  content
    +end
    +
    +
    + +
    +

    + + .apply_configured_gemspec_required_ruby_version(content, facts, receiver:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +7541
    +7542
    +7543
    +7544
    +7545
    +7546
    +7547
    +7548
    +7549
    +7550
    +7551
    +7552
    +7553
    +7554
    +7555
    +7556
    +7557
    +7558
    +7559
    +7560
    +
    +
    # File 'lib/kettle/jem.rb', line 7541
    +
    +def apply_configured_gemspec_required_ruby_version(content, facts, receiver:)
    +  return remove_gemspec_assignment(content, receiver: receiver, field: "required_ruby_version") if explicit_zero_runtime_floor?(facts)
    +
    +  min_ruby = minimum_ruby_token(facts.to_h.dig(:rubygems, :min_ruby))
    +  if min_ruby.to_s.empty?
    +    return content
    +  end
    +
    +  replacement = %(#{receiver}.required_ruby_version = ">= #{min_ruby}"#{required_ruby_version_rubocop_disable(min_ruby)})
    +  existing = gemspec_assignment_records(content, receiver: receiver).find { |record| record.fetch(:field) == "required_ruby_version" }
    +  return replace_source_range_lines(content, existing.fetch(:start_line), existing.fetch(:end_line), "#{leading_whitespace(existing.fetch(:source))}#{replacement}\n") if existing
    +
    +  licenses = gemspec_assignment_records(content, receiver: receiver).find { |record| record.fetch(:field) == "licenses" }
    +  return insert_lines_after(content, licenses.fetch(:end_line), "  #{replacement}\n") if licenses
    +
    +  homepage = gemspec_assignment_records(content, receiver: receiver).find { |record| record.fetch(:field) == "homepage" }
    +  return insert_lines_after(content, homepage.fetch(:end_line), "  #{replacement}\n") if homepage
    +
    +  content
    +end
    +
    +
    + +
    +

    + + .apply_kettle_config_bootstrap(project_root, recipe, env: ENV) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +8782
    +8783
    +8784
    +8785
    +8786
    +8787
    +8788
    +8789
    +8790
    +8791
    +8792
    +
    +
    # File 'lib/kettle/jem.rb', line 8782
    +
    +def apply_kettle_config_bootstrap(project_root, recipe, env: ENV)
    +  content = recipe_template_content(project_root, recipe)
    +  tokens = stringify_template_tokens(recipe.fetch(:template_tokens, {}))
    +  content = resolve_template_tokens(content, tokens, scan_unresolved: false)
    +  bootstrap_licenses = Array(recipe[:bootstrap_licenses]).map(&:to_s).reject(&:empty?)
    +  content = replace_kettle_config_bootstrap_licenses(content, bootstrap_licenses) unless bootstrap_licenses.empty?
    +  content = replace_kettle_config_bootstrap_project_emoji(content, recipe[:bootstrap_project_emoji]) unless recipe[:bootstrap_project_emoji].to_s.empty?
    +  content = apply_kettle_config_bootstrap_profile(content, recipe[:bootstrap_template_profile], recipe[:bootstrap_gemspec_path])
    +  content = add_shim_bootstrap_config(content, recipe[:bootstrap_shim]) if recipe[:bootstrap_shim].is_a?(Hash)
    +  sync_kettle_config_env_overrides(content, env)
    +end
    +
    +
    + +
    +

    + + .apply_kettle_config_bootstrap_profile(content, profile, gemspec_path) ⇒ Object + + + + + +

    +
    + + + +
    +
    +
    + +

    Raises:

    +
      + +
    • + + + (Error) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +9120
    +9121
    +9122
    +9123
    +9124
    +9125
    +9126
    +9127
    +9128
    +
    +
    # File 'lib/kettle/jem.rb', line 9120
    +
    +def apply_kettle_config_bootstrap_profile(content, profile, gemspec_path)
    +  return content if profile.to_s.empty?
    +  return replace_yaml_scalar_path(content, %w[templates profile], FULL_TEMPLATE_PROFILE) if profile.to_s == FULL_TEMPLATE_PROFILE
    +  return apply_monorepo_root_template_profile(content) if profile.to_s == MONOREPO_ROOT_TEMPLATE_PROFILE
    +  return apply_monorepo_subgem_template_profile(content, gemspec_path, profile) if monorepo_subgem_template_profile_value?(profile)
    +  return apply_shim_template_profile(content, gemspec_path) if profile.to_s == SHIM_TEMPLATE_PROFILE
    +
    +  raise Error, "Unknown kettle-jem template profile: #{profile}"
    +end
    +
    +
    + +
    +

    + + .apply_markdown_conditional_block(content, name, keep:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5209
    +5210
    +5211
    +5212
    +5213
    +5214
    +5215
    +5216
    +5217
    +5218
    +5219
    +5220
    +5221
    +5222
    +5223
    +5224
    +5225
    +5226
    +5227
    +5228
    +5229
    +5230
    +5231
    +5232
    +
    +
    # File 'lib/kettle/jem.rb', line 5209
    +
    +def apply_markdown_conditional_block(content, name, keep:)
    +  ensure_runtime_dependencies!
    +  start_text = "KJ:#{name}:START"
    +  end_text = "KJ:#{name}:END"
    +  if keep
    +    processed = delete_markdown_with_ast_crispr(
    +      content,
    +      Ast::Crispr::Markdown::Markly::Selectors.html_comment(text: start_text, limit: {at_least: 0})
    +    )
    +    delete_markdown_with_ast_crispr(
    +      processed,
    +      Ast::Crispr::Markdown::Markly::Selectors.html_comment(text: end_text, limit: {at_least: 0})
    +    )
    +  else
    +    delete_markdown_with_ast_crispr(
    +      content,
    +      Ast::Crispr::Markdown::Markly::Selectors.html_comment_block(
    +        start_text: start_text,
    +        end_text: end_text,
    +        limit: {at_least: 0}
    +      )
    +    )
    +  end
    +end
    +
    +
    + +
    +

    + + .apply_monorepo_root_template_profile(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +9181
    +9182
    +9183
    +9184
    +9185
    +9186
    +9187
    +9188
    +9189
    +9190
    +9191
    +9192
    +9193
    +9194
    +9195
    +9196
    +9197
    +9198
    +9199
    +9200
    +9201
    +9202
    +9203
    +9204
    +
    +
    # File 'lib/kettle/jem.rb', line 9181
    +
    +def apply_monorepo_root_template_profile(content)
    +  entry_lines = MONOREPO_ROOT_TEMPLATE_ENTRIES.map { |entry| "    - #{entry}" }
    +  profiled_content = replace_yaml_scalar_path(content, %w[templates profile], MONOREPO_ROOT_TEMPLATE_PROFILE)
    +  entries_block = ["  entries:", *entry_lines].join("\n")
    +  updated = insert_after_line_sequence(
    +    profiled_content,
    +    ["templates:", "  root: packaged", "  apply: true", "  profile: #{MONOREPO_ROOT_TEMPLATE_PROFILE}"],
    +    entries_block,
    +    nil
    +  )
    +  if updated == profiled_content
    +    updated = insert_after_line_sequence(
    +      profiled_content,
    +      ["templates:", "  root: packaged", "  apply: true"],
    +      entries_block,
    +      "Could not apply monorepo-root template profile to .kettle-jem.yml bootstrap template"
    +    )
    +  end
    +  if updated == profiled_content
    +    raise Error,
    +      "Could not apply monorepo-root template profile to .kettle-jem.yml bootstrap template"
    +  end
    +  add_monorepo_root_file_overrides(updated)
    +end
    +
    +
    + +
    +

    + + .apply_monorepo_subgem_readme_recipe(content, facts) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5234
    +5235
    +5236
    +5237
    +5238
    +5239
    +5240
    +5241
    +5242
    +5243
    +5244
    +
    +
    # File 'lib/kettle/jem.rb', line 5234
    +
    +def apply_monorepo_subgem_readme_recipe(content, facts)
    +  return content unless monorepo_subgem_template_profile?(facts)
    +
    +  source_url = facts.dig(:package, :source_url).to_s
    +  return content if source_url.empty?
    +
    +  root_doc_links = MONOREPO_SUBGEM_README_BLOB_PATHS.to_h do |path|
    +    [path, source_blob_url(source_url, path)]
    +  end
    +  rewrite_markdown_reference_links(content, root_doc_links)
    +end
    +
    +
    + +
    +

    + + .apply_monorepo_subgem_template_profile(content, gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +9206
    +9207
    +9208
    +9209
    +9210
    +9211
    +9212
    +9213
    +9214
    +9215
    +9216
    +9217
    +9218
    +9219
    +9220
    +9221
    +9222
    +9223
    +9224
    +9225
    +9226
    +9227
    +9228
    +9229
    +9230
    +9231
    +9232
    +9233
    +9234
    +9235
    +9236
    +9237
    +9238
    +9239
    +9240
    +9241
    +
    +
    # File 'lib/kettle/jem.rb', line 9206
    +
    +def apply_monorepo_subgem_template_profile(content, gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE)
    +  entries = monorepo_subgem_template_entries(gemspec_path, profile)
    +  entry_lines = entries.flat_map do |entry|
    +    if entry.is_a?(Hash)
    +      [
    +        "    - source: #{entry.fetch("source")}",
    +        "      target: #{entry.fetch("target")}"
    +      ]
    +    else
    +      ["    - #{entry}"]
    +    end
    +  end
    +  normalized_profile = normalize_template_profile(profile)
    +  profiled_content = replace_yaml_scalar_path(content, %w[templates profile], normalized_profile)
    +  entries_block = ["  entries:", *entry_lines].join("\n")
    +  updated = insert_after_line_sequence(
    +    profiled_content,
    +    ["templates:", "  root: packaged", "  apply: true", "  profile: #{normalized_profile}"],
    +    entries_block,
    +    nil
    +  )
    +  if updated == profiled_content
    +    updated = insert_after_line_sequence(
    +      profiled_content,
    +      ["templates:", "  root: packaged", "  apply: true"],
    +      entries_block,
    +      "Could not apply monorepo-subgem template profile to .kettle-jem.yml bootstrap template"
    +    )
    +  end
    +  if updated == profiled_content
    +    raise Error,
    +      "Could not apply #{normalized_profile} template profile to .kettle-jem.yml bootstrap template"
    +  end
    +
    +  add_monorepo_subgem_file_overrides(updated, gemspec_path, normalized_profile)
    +end
    +
    +
    + +
    +

    + + .apply_monorepo_subgem_thin_readme_projection(content, facts) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5246
    +5247
    +5248
    +5249
    +5250
    +5251
    +5252
    +5253
    +5254
    +5255
    +5256
    +5257
    +5258
    +5259
    +5260
    +5261
    +5262
    +5263
    +5264
    +5265
    +5266
    +5267
    +5268
    +5269
    +
    +
    # File 'lib/kettle/jem.rb', line 5246
    +
    +def apply_monorepo_subgem_thin_readme_projection(content, facts)
    +  ensure_runtime_dependencies!
    +  return content unless monorepo_subgem_template_profile?(facts)
    +
    +  context = Ast::Crispr::Markdown::Markly.document_context(content: content, source_label: "README.md")
    +  link_definitions = context.structural_owners(owner_scope: :link_definitions)
    +  heading_sections = context.structural_owners(owner_scope: :heading_sections)
    +  removable = heading_sections.each_with_index.select do |owner, index|
    +    owner.level.to_i > 1 && !MONOREPO_SUBGEM_THIN_README_KEEP_HEADINGS.include?(owner.base.to_s)
    +  end.reject do |owner, index|
    +    markdown_heading_has_preserved_readme_ancestor?(heading_sections, index)
    +  end.map(&:first)
    +  projected = removable.reverse.reduce(content.to_s) do |processed, owner|
    +    delete_markdown_with_ast_crispr(
    +      processed,
    +      Ast::Crispr::Markdown::Markly::Selectors.heading_section(
    +        heading_text: owner.heading_text,
    +        level: owner.level,
    +        limit: {at_least: 0}
    +      )
    +    )
    +  end
    +  append_missing_markdown_link_definitions(projected, link_definitions)
    +end
    +
    +
    + +
    +

    + + .apply_project(project_root, env: ENV, run_options: {}) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3466
    +3467
    +3468
    +3469
    +3470
    +3471
    +3472
    +3473
    +3474
    +3475
    +3476
    +3477
    +3478
    +3479
    +3480
    +3481
    +3482
    +3483
    +3484
    +3485
    +3486
    +3487
    +3488
    +3489
    +3490
    +3491
    +3492
    +3493
    +3494
    +3495
    +
    +
    # File 'lib/kettle/jem.rb', line 3466
    +
    +def apply_project(project_root, env: ENV, run_options: {})
    +  events = event_stream_from_options(run_options)
    +  report = plan_project(project_root, env: env, run_options: run_options).merge(mode: "apply")
    +  with_event_phase(events, "apply") do
    +    before_apply_files = with_event_phase(events, "snapshot_changed_files") do
    +      snapshot_changed_files(
    +        project_root,
    +        report.fetch(:recipe_reports).filter_map { |entry| entry[:relative_path] }
    +      )
    +    end
    +    with_event_phase(events, "write_template_files") { run_apply_phases(project_root, report) }
    +    report[:changed_files] = with_event_phase(events, "actual_changed_files") do
    +      actual_changed_files_after_apply(project_root, report.fetch(:changed_files), before_apply_files)
    +    end
    +    report[:post_apply_steps] = with_event_phase(events, "post_apply_steps") { post_apply_steps(project_root, report) }
    +    emit_step_events(events, "post_apply_step", report.fetch(:post_apply_steps), phase: "post_apply")
    +  end
    +  report[:changed_files] = (report.fetch(:changed_files, []) + report.fetch(:post_apply_steps).flat_map do |step|
    +    step.fetch(:changed_files, [])
    +  end).uniq.sort
    +  report[:duplicate_drift] = with_event_phase(events, "duplicate_drift") do
    +    duplicate_drift_report(
    +      project_root: project_root,
    +      template_root: template_root_path(project_root, config: kettle_jem_config(project_root)),
    +      run_options: run_options
    +    )
    +  end
    +  emit_summary_event(events, report)
    +  report
    +end
    +
    +
    + +
    +

    + + .apply_readme_badge_policy(content, facts) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5175
    +5176
    +5177
    +5178
    +5179
    +5180
    +5181
    +5182
    +5183
    +5184
    +5185
    +5186
    +5187
    +5188
    +5189
    +5190
    +5191
    +5192
    +5193
    +5194
    +5195
    +
    +
    # File 'lib/kettle/jem.rb', line 5175
    +
    +def apply_readme_badge_policy(content, facts)
    +  processed = remove_readme_badge_and_refs(content, README_CODETRIAGE_BADGE, README_CODETRIAGE_LINK_LABELS)
    +  if facts.dig(:readme_style, :fossa_project).to_s.empty?
    +    processed = remove_readme_badge_and_refs(processed, README_FOSSA_BADGE, README_FOSSA_LINK_LABELS)
    +  end
    +  if Array(facts.dig(:readme_style, :disabled_integrations)).map(&:to_s).include?(SKYWALKING_EYES_INTEGRATION)
    +    processed = remove_readme_badge_and_refs(
    +      processed,
    +      README_LICENSE_EYE_WORKFLOW_BADGE,
    +      README_LICENSE_EYE_WORKFLOW_LINK_LABELS
    +    )
    +  end
    +  if facts.dig(:funding, :open_collective_disabled)
    +    processed = remove_readme_badge_and_refs(
    +      processed,
    +      README_OPEN_COLLECTIVE_FUNDING_BADGES,
    +      README_OPEN_COLLECTIVE_LINK_LABELS
    +    )
    +  end
    +  processed
    +end
    +
    +
    + +
    +

    + + .apply_readme_conditional_blocks(content, facts) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5169
    +5170
    +5171
    +5172
    +5173
    +
    +
    # File 'lib/kettle/jem.rb', line 5169
    +
    +def apply_readme_conditional_blocks(content, facts)
    +  open_collective_enabled = !facts.dig(:funding, :open_collective_disabled)
    +  processed = apply_markdown_conditional_block(content, "OPEN_COLLECTIVE", keep: open_collective_enabled)
    +  apply_markdown_conditional_block(processed, "NO_OPEN_COLLECTIVE", keep: !open_collective_enabled)
    +end
    +
    +
    + +
    +

    + + .apply_readme_kloc_badge(content, facts, project_root) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5120
    +5121
    +5122
    +5123
    +5124
    +5125
    +5126
    +5127
    +5128
    +
    +
    # File 'lib/kettle/jem.rb', line 5120
    +
    +def apply_readme_kloc_badge(content, facts, project_root)
    +  kloc = readme_kloc_from_changelog(project_root, facts.dig(:project_runtime, :version))
    +  return content if kloc.to_s.empty?
    +
    +  content.to_s.gsub(
    +    /(\[🧮kloc-img\]:\s*https?:\/\/img\.shields\.io\/badge\/KLOC-)(\d+(?:\.\d+)?)(-[^\s]*)/,
    +    "\\1#{kloc}\\3"
    +  )
    +end
    +
    +
    + +
    +

    + + .apply_readme_style(project_root, env: ENV) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4056
    +4057
    +4058
    +4059
    +4060
    +4061
    +4062
    +4063
    +4064
    +
    +
    # File 'lib/kettle/jem.rb', line 4056
    +
    +def apply_readme_style(project_root, env: ENV)
    +  report = plan_readme_style(project_root, env: env).merge(mode: "apply")
    +  return report unless report.fetch(:changed)
    +
    +  path = File.join(project_root, report.fetch(:readme_path))
    +  FileUtils.mkdir_p(File.dirname(path))
    +  File.write(path, report.fetch(:final_content))
    +  report
    +end
    +
    +
    + +
    +

    + + .apply_recipe_report(project_root, recipe_report) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +10087
    +10088
    +10089
    +10090
    +10091
    +10092
    +10093
    +10094
    +10095
    +10096
    +10097
    +
    +
    # File 'lib/kettle/jem.rb', line 10087
    +
    +def apply_recipe_report(project_root, recipe_report)
    +  return unless recipe_report[:changed]
    +
    +  path = File.join(project_root, recipe_report.fetch(:relative_path))
    +  if recipe_report.dig(:metadata, :delete_file)
    +    FileUtils.rm_f(path)
    +  else
    +    FileUtils.mkdir_p(File.dirname(path))
    +    File.write(path, recipe_report.fetch(:final_content))
    +  end
    +end
    +
    +
    + +
    +

    + + .apply_shim_template_profile(content, gemspec_path) ⇒ Object + + + + + +

    +
    + + + +
    +
    +
    + +

    Raises:

    +
      + +
    • + + + (Error) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +9130
    +9131
    +9132
    +9133
    +9134
    +9135
    +9136
    +9137
    +9138
    +9139
    +9140
    +9141
    +9142
    +9143
    +9144
    +9145
    +9146
    +9147
    +9148
    +9149
    +9150
    +9151
    +9152
    +9153
    +9154
    +9155
    +9156
    +
    +
    # File 'lib/kettle/jem.rb', line 9130
    +
    +def apply_shim_template_profile(content, gemspec_path)
    +  entry_lines = shim_template_entries_for_config(gemspec_path, {}).flat_map do |entry|
    +    [
    +      "    - source: #{entry.fetch("source")}",
    +      "      target: #{entry.fetch("target")}"
    +    ]
    +  end
    +  profiled_content = replace_yaml_scalar_path(content, %w[templates profile], SHIM_TEMPLATE_PROFILE)
    +  entries_block = ["  entries:", *entry_lines].join("\n")
    +  updated = insert_after_line_sequence(
    +    profiled_content,
    +    ["templates:", "  root: packaged", "  apply: true", "  profile: #{SHIM_TEMPLATE_PROFILE}"],
    +    entries_block,
    +    nil
    +  )
    +  if updated == profiled_content
    +    updated = insert_after_line_sequence(
    +      profiled_content,
    +      ["templates:", "  root: packaged", "  apply: true"],
    +      entries_block,
    +      "Could not apply shim template profile to .kettle-jem.yml bootstrap template"
    +    )
    +  end
    +  raise Error, "Could not apply shim template profile to .kettle-jem.yml bootstrap template" if updated == profiled_content
    +
    +  add_shim_file_overrides(updated, gemspec_path)
    +end
    +
    +
    + +
    +

    + + .apply_template_source(project_root, recipe, original, facts: nil, env: ENV) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4901
    +4902
    +4903
    +4904
    +4905
    +4906
    +4907
    +4908
    +4909
    +4910
    +4911
    +4912
    +4913
    +4914
    +4915
    +4916
    +4917
    +4918
    +4919
    +4920
    +4921
    +4922
    +4923
    +4924
    +4925
    +4926
    +4927
    +4928
    +4929
    +4930
    +4931
    +4932
    +4933
    +4934
    +4935
    +4936
    +4937
    +4938
    +4939
    +4940
    +4941
    +4942
    +4943
    +4944
    +4945
    +4946
    +4947
    +4948
    +4949
    +4950
    +4951
    +4952
    +4953
    +4954
    +4955
    +4956
    +4957
    +4958
    +4959
    +4960
    +4961
    +
    +
    # File 'lib/kettle/jem.rb', line 4901
    +
    +def apply_template_source(project_root, recipe, original, facts: nil, env: ENV)
    +  strategy = recipe.dig(:template_preference, :strategy).to_s
    +  return original if strategy == "keep_destination"
    +
    +  content = recipe_template_content(project_root, recipe)
    +  return finalize_github_workflow_template(content, facts) if strategy == "raw_copy" && github_workflow_template_recipe?(recipe)
    +  return finalize_template_source_content(recipe, content) if strategy == "raw_copy"
    +
    +  resolved = resolve_template_tokens(
    +    content,
    +    recipe.fetch(:template_tokens, {}),
    +    scan_unresolved: unresolved_template_scan?(recipe)
    +  )
    +rescue ArgumentError => e
    +  raise ArgumentError, "#{recipe.fetch(:target_path)}: #{e.message}"
    +else
    +  resolved = prepare_readme_template(resolved, recipe[:readme_style]) if recipe.fetch(:target_path) == "README.md"
    +  resolved = prepare_github_workflow_template(resolved, recipe, facts)
    +  if recipe.fetch(:target_path) == "README.md" && (strategy.empty? || strategy == "merge")
    +    processed = postprocess_readme_content(
    +      merge_readme_template(
    +        template_content: resolved,
    +        destination_content: original,
    +        preserve_config: recipe.dig(:template_preference, :readme_preserve_config) || {}
    +      ),
    +      facts,
    +      project_root: project_root
    +    )
    +    return append_used_markdown_link_definitions(processed, resolved)
    +  end
    +  if strategy.empty? || strategy == "merge"
    +    merged = merge_config_template_source(recipe, resolved, original, facts: facts, env: env)
    +    merged = preserve_mise_project_settings(recipe, merged, original, project_root: project_root) if template_file_type(recipe) == :toml
    +    return sync_kettle_config_env_overrides(merged, env) if recipe.fetch(:target_path) == KETTLE_CONFIG_PATH
    +
    +    if github_workflow_template_recipe?(recipe)
    +      merged = preserve_github_workflow_project_settings(recipe, merged, original, project_root: project_root)
    +      merged = finalize_github_workflow_template(merged, facts)
    +      return preserve_newer_github_workflow_action_pins(merged, original)
    +    end
    +
    +    return finalize_template_source_content(recipe, merged)
    +  end
    +  if strategy == "accept_template"
    +    accepted = finalize_accepted_template_source(recipe, resolved, original, facts: facts, project_root: project_root)
    +    accepted = preserve_github_workflow_project_settings(recipe, accepted, original, project_root: project_root) if github_workflow_template_recipe?(recipe)
    +    accepted = sync_kettle_config_env_overrides(accepted, env) if recipe.fetch(:target_path) == KETTLE_CONFIG_PATH
    +    if github_workflow_template_recipe?(recipe)
    +      accepted = finalize_github_workflow_template(accepted, facts)
    +      accepted = preserve_newer_github_workflow_action_pins(accepted, original)
    +    end
    +    return postprocess_readme_content(accepted, facts, project_root: project_root) if recipe.fetch(:target_path) == "README.md"
    +
    +    return finalize_template_source_content(recipe, accepted)
    +  end
    +
    +  resolved = finalize_github_workflow_template(resolved, facts) if github_workflow_template_recipe?(recipe)
    +  return postprocess_readme_content(resolved, facts, project_root: project_root) if recipe.fetch(:target_path) == "README.md"
    +
    +  finalize_template_source_content(recipe, resolved)
    +end
    +
    +
    + +
    +

    + + .appraisal_all_versions_for(resolver:, gem_name:, mode:, requirements: nil, include_versions: nil, exclude_versions: nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2636
    +2637
    +2638
    +2639
    +2640
    +2641
    +2642
    +2643
    +
    +
    # File 'lib/kettle/jem.rb', line 2636
    +
    +def appraisal_all_versions_for(resolver:, gem_name:, mode:, requirements: nil, include_versions: nil, exclude_versions: nil)
    +  base_versions = if mode.to_s == "patch"
    +    resolver.versions(gem_name, requirements: requirements).map { |entry| entry[:number] || entry["number"] }
    +  else
    +    resolver.minor_versions_by_major(gem_name, requirements: requirements).flat_map { |entry| entry[:minors] || entry["minors"] }
    +  end
    +  appraisal_finalize_versions(base_versions, include_versions: include_versions, exclude_versions: exclude_versions)
    +end
    +
    +
    + +
    +

    + + .appraisal_assign_version_buckets(selected_versions:, seams:, buckets:, bucket_ranges:, all_versions:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2405
    +2406
    +2407
    +2408
    +2409
    +2410
    +2411
    +2412
    +2413
    +2414
    +2415
    +2416
    +2417
    +2418
    +2419
    +
    +
    # File 'lib/kettle/jem.rb', line 2405
    +
    +def appraisal_assign_version_buckets(selected_versions:, seams:, buckets:, bucket_ranges:, all_versions:)
    +  return [] if selected_versions.empty? || buckets.empty?
    +
    +  normalized_ranges = appraisal_normalized_bucket_ranges(bucket_ranges)
    +  version_min_rubies = appraisal_version_min_ruby_map(all_versions, seams)
    +  assignments = selected_versions.sort_by { |version| Gem::Version.new(version) }.filter_map do |version|
    +    min_ruby = version_min_rubies[version]
    +    next unless min_ruby
    +
    +    next_seam = appraisal_next_seam_ruby(version, min_ruby, all_versions, version_min_rubies)
    +    bucket = next_seam ? appraisal_bucket_below(next_seam, buckets, normalized_ranges) : buckets.last
    +    {version: version, bucket: bucket} if bucket
    +  end
    +  appraisal_fill_bucket_gaps(assignments, buckets, normalized_ranges, version_min_rubies, all_versions)
    +end
    +
    +
    + +
    +

    + + .appraisal_block_has_matrix_dependency_gemfile?(block, matrix_dependency_gemfiles) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +7029
    +7030
    +7031
    +7032
    +7033
    +7034
    +7035
    +7036
    +7037
    +7038
    +
    +
    # File 'lib/kettle/jem.rb', line 7029
    +
    +def appraisal_block_has_matrix_dependency_gemfile?(block, matrix_dependency_gemfiles)
    +  ruby_call_records(block, :eval_gemfile).any? do |call|
    +    path = ruby_string_argument(call).to_s
    +    next true if matrix_dependency_gemfiles.include?(path)
    +
    +    path.start_with?("modular/") &&
    +      path.delete_prefix("modular/").include?("/") &&
    +      !path.start_with?("modular/x_std_libs/")
    +  end
    +end
    +
    +
    + +
    +

    + + .appraisal_blocks(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +7276
    +7277
    +7278
    +7279
    +7280
    +7281
    +7282
    +7283
    +7284
    +7285
    +7286
    +7287
    +7288
    +7289
    +7290
    +7291
    +
    +
    # File 'lib/kettle/jem.rb', line 7276
    +
    +def appraisal_blocks(content)
    +  lines = content.to_s.lines
    +  blocks = {}
    +  order = []
    +  records = appraisal_call_records(content)
    +  records.each do |record|
    +    name = record.fetch(:name)
    +    unless blocks.key?(name)
    +      blocks[name] = record.fetch(:source)
    +      order << name
    +    end
    +  end
    +  prelude_end = records.empty? ? lines.length : records.first.fetch(:start_line) - 1
    +  prelude = lines[0...prelude_end].join
    +  {prelude: prelude, blocks: blocks, order: order}
    +end
    +
    +
    + +
    +

    + + .appraisal_bucket_below(ruby_floor, buckets, bucket_ranges) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2500
    +2501
    +2502
    +2503
    +2504
    +2505
    +2506
    +2507
    +
    +
    # File 'lib/kettle/jem.rb', line 2500
    +
    +def appraisal_bucket_below(ruby_floor, buckets, bucket_ranges)
    +  buckets.filter_map do |bucket|
    +    range = bucket_ranges[bucket]
    +    next unless range && range.fetch(:ceiling) < ruby_floor
    +
    +    [bucket, range.fetch(:ceiling)]
    +  end.max_by(&:last)&.first
    +end
    +
    +
    + +
    +

    + + .appraisal_bucket_sort_key(bucket) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2460
    +2461
    +2462
    +2463
    +
    +
    # File 'lib/kettle/jem.rb', line 2460
    +
    +def appraisal_bucket_sort_key(bucket)
    +  match = bucket.to_s.match(/\Ar(\d+)(?:\.(\d+))?\z/)
    +  [match[1].to_i, match[2] ? match[2].to_i : 999]
    +end
    +
    +
    + +
    +

    + + .appraisal_call_records(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +7310
    +7311
    +7312
    +7313
    +7314
    +7315
    +7316
    +7317
    +7318
    +7319
    +7320
    +7321
    +7322
    +7323
    +
    +
    # File 'lib/kettle/jem.rb', line 7310
    +
    +def appraisal_call_records(content)
    +  lines = content.to_s.lines
    +  ruby_call_records(content, :appraise).filter_map do |call|
    +    name = ruby_string_argument(call)
    +    next unless name
    +
    +    {
    +      name: name,
    +      start_line: call.location.start_line,
    +      end_line: ruby_node_source_end_line(call),
    +      source: (lines[(call.location.start_line - 1)..(ruby_node_source_end_line(call) - 1)] || []).join
    +    }
    +  end
    +end
    +
    +
    + +
    +

    + + .appraisal_compatible_version_for_bucket?(resolver:, gem_name:, version:, ruby_series:, bucket_ranges:) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +2653
    +2654
    +2655
    +2656
    +2657
    +2658
    +2659
    +2660
    +2661
    +2662
    +2663
    +
    +
    # File 'lib/kettle/jem.rb', line 2653
    +
    +def appraisal_compatible_version_for_bucket?(resolver:, gem_name:, version:, ruby_series:, bucket_ranges:)
    +  range = bucket_ranges[ruby_series] || bucket_ranges[ruby_series.to_s]
    +  return true unless range
    +
    +  ceiling = Gem::Version.new((range[:ceiling] || range["ceiling"]).to_s)
    +  exact_version = appraisal_latest_minor_patch(resolver: resolver, gem_name: gem_name, version: version)
    +  min_ruby = resolver.min_ruby_version(gem_name, exact_version)
    +  min_ruby.nil? || Gem::Version.new(min_ruby.to_s) <= ceiling
    +rescue
    +  true
    +end
    +
    +
    + +
    +

    + + .appraisal_eval_gemfile_path(path) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2207
    +2208
    +2209
    +
    +
    # File 'lib/kettle/jem.rb', line 2207
    +
    +def appraisal_eval_gemfile_path(path)
    +  path.to_s.delete_prefix("gemfiles/")
    +end
    +
    +
    + +
    +

    + + .appraisal_extract_runtime_dependencies(gemspec_content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2587
    +2588
    +2589
    +2590
    +2591
    +2592
    +
    +
    # File 'lib/kettle/jem.rb', line 2587
    +
    +def appraisal_extract_runtime_dependencies(gemspec_content)
    +  gemspec_dependency_records(gemspec_content)
    +    .reject { |record| record.fetch(:kind) == "add_development_dependency" }
    +    .map { |record| record.fetch(:name) }
    +    .uniq
    +end
    +
    +
    + +
    +

    + + .appraisal_file_content(matrix_entries) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2187
    +2188
    +2189
    +2190
    +2191
    +2192
    +2193
    +2194
    +2195
    +2196
    +2197
    +2198
    +2199
    +2200
    +2201
    +2202
    +2203
    +2204
    +2205
    +
    +
    # File 'lib/kettle/jem.rb', line 2187
    +
    +def appraisal_file_content(matrix_entries)
    +  lines = [
    +    "# frozen_string_literal: true",
    +    "",
    +    "# Generated by kettle-jem",
    +    "# Do not edit directly; regenerate from Kettle/Jem appraisal matrix metadata.",
    +    ""
    +  ]
    +  matrix_entries.each do |entry|
    +    lines << %(appraise "#{entry.fetch(:name)}" do)
    +    lines << %(  eval_gemfile "#{appraisal_eval_gemfile_path(entry.fetch(:tier1_gemfile))}") if entry[:tier1_gemfile]
    +    lines << %(  eval_gemfile "#{appraisal_eval_gemfile_path(entry.fetch(:tier2_gemfile))}") if entry[:tier2_gemfile]
    +    lines << %(  eval_gemfile "#{appraisal_eval_gemfile_path(entry.fetch(:x_std_libs_gemfile))}") if entry[:x_std_libs_gemfile]
    +    lines << "end"
    +    lines << ""
    +  end
    +  lines.pop while lines.last == ""
    +  ensure_trailing_newline(lines.join("\n"))
    +end
    +
    +
    + +
    +

    + + .appraisal_fill_bucket_gaps(assignments, buckets, bucket_ranges, version_min_rubies, all_versions) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2509
    +2510
    +2511
    +2512
    +2513
    +2514
    +2515
    +2516
    +2517
    +2518
    +2519
    +2520
    +2521
    +2522
    +2523
    +2524
    +2525
    +2526
    +
    +
    # File 'lib/kettle/jem.rb', line 2509
    +
    +def appraisal_fill_bucket_gaps(assignments, buckets, bucket_ranges, version_min_rubies, all_versions)
    +  covered = assignments.map { |assignment| assignment.fetch(:bucket) }
    +  (buckets - covered).each do |bucket|
    +    range = bucket_ranges[bucket]
    +    next unless range
    +
    +    filler = all_versions.sort_by { |version| Gem::Version.new(version) }.reverse.find do |version|
    +      ruby = version_min_rubies[version]
    +      ruby&.between?(range.fetch(:floor), range.fetch(:ceiling))
    +    end
    +    filler ||= all_versions.sort_by { |version| Gem::Version.new(version) }.reverse.find do |version|
    +      ruby = version_min_rubies[version]
    +      ruby && ruby <= range.fetch(:ceiling)
    +    end
    +    assignments << {version: filler, bucket: bucket, filler: true} if filler
    +  end
    +  assignments.sort_by { |assignment| bucket_ranges.fetch(assignment.fetch(:bucket)).fetch(:floor) }
    +end
    +
    +
    + +
    +

    + + .appraisal_filtered_versions(version_metadata, requirements:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2351
    +2352
    +2353
    +2354
    +2355
    +2356
    +2357
    +2358
    +2359
    +2360
    +2361
    +
    +
    # File 'lib/kettle/jem.rb', line 2351
    +
    +def appraisal_filtered_versions(, requirements:)
    +  requirement = requirements ? Gem::Requirement.new(Array(requirements)) : nil
    +  .filter_map do |entry|
    +    number = entry[:number] || entry["number"]
    +    next if number.to_s.empty?
    +    next if entry[:prerelease] || entry["prerelease"]
    +    next if requirement && !requirement.satisfied_by?(Gem::Version.new(number))
    +
    +    number.to_s
    +  end.sort_by { |version| Gem::Version.new(version) }
    +end
    +
    +
    + +
    +

    + + .appraisal_finalize_versions(base_versions, include_versions: nil, exclude_versions: nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2645
    +2646
    +2647
    +2648
    +2649
    +2650
    +2651
    +
    +
    # File 'lib/kettle/jem.rb', line 2645
    +
    +def appraisal_finalize_versions(base_versions, include_versions: nil, exclude_versions: nil)
    +  merged = appraisal_sort_versions(Array(base_versions) + Array(include_versions))
    +  excluded = Array(exclude_versions).map(&:to_s).to_set
    +  return merged if excluded.empty?
    +
    +  appraisal_sort_versions(merged.reject { |version| excluded.include?(version) })
    +end
    +
    +
    + +
    +

    + + .appraisal_find_ruby_seams(version_metadata) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2379
    +2380
    +2381
    +2382
    +2383
    +2384
    +2385
    +2386
    +2387
    +2388
    +2389
    +2390
    +2391
    +2392
    +
    +
    # File 'lib/kettle/jem.rb', line 2379
    +
    +def appraisal_find_ruby_seams()
    +  minors = appraisal_latest_patch_by_minor()
    +  seams = []
    +  previous = nil
    +  minors.sort_by { |minor, _entry| Gem::Version.new(minor) }.each do |minor, entry|
    +    min_ruby = Gem::Version.new((entry[:min_ruby] || entry["min_ruby"]).to_s)
    +    min_ruby = [min_ruby, DEFAULT_TEST_MINIMUM_RUBY].max
    +    if previous.nil? || min_ruby > previous
    +      seams << {version: minor, min_ruby: min_ruby}
    +    end
    +    previous = min_ruby
    +  end
    +  seams
    +end
    +
    +
    + +
    +

    + + .appraisal_format_version(version) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2146
    +2147
    +2148
    +
    +
    # File 'lib/kettle/jem.rb', line 2146
    +
    +def appraisal_format_version(version)
    +  version.to_s.tr(".", "-")
    +end
    +
    +
    + +
    +

    + + .appraisal_gem_abbreviation(gem_name) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2142
    +2143
    +2144
    +
    +
    # File 'lib/kettle/jem.rb', line 2142
    +
    +def appraisal_gem_abbreviation(gem_name)
    +  APPRAISAL_GEM_ABBREVIATIONS.fetch(gem_name.to_s, gem_name.to_s)
    +end
    +
    +
    + +
    +

    + + .appraisal_latest_minor_patch(resolver:, gem_name:, version:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2665
    +2666
    +2667
    +2668
    +2669
    +2670
    +2671
    +2672
    +2673
    +2674
    +2675
    +2676
    +
    +
    # File 'lib/kettle/jem.rb', line 2665
    +
    +def appraisal_latest_minor_patch(resolver:, gem_name:, version:)
    +  all_versions = resolver.versions(gem_name)
    +  prefix = "#{version}."
    +  matching = all_versions.select do |entry|
    +    number = (entry[:number] || entry["number"]).to_s
    +    number == version.to_s || number.start_with?(prefix)
    +  end
    +  return version.to_s if matching.empty?
    +
    +  latest = matching.max_by { |entry| Gem::Version.new((entry[:number] || entry["number"]).to_s) }
    +  (latest[:number] || latest["number"]).to_s
    +end
    +
    +
    + +
    +

    + + .appraisal_latest_patch_by_minor(version_metadata) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2421
    +2422
    +2423
    +2424
    +2425
    +2426
    +2427
    +2428
    +2429
    +2430
    +2431
    +
    +
    # File 'lib/kettle/jem.rb', line 2421
    +
    +def appraisal_latest_patch_by_minor()
    +  .each_with_object({}) do |entry, latest|
    +    number = (entry[:number] || entry["number"]).to_s
    +    next if number.empty?
    +
    +    version = Gem::Version.new(number)
    +    minor = "#{version.segments[0]}.#{version.segments[1] || 0}"
    +    current = latest[minor]
    +    latest[minor] = entry if current.nil? || version > Gem::Version.new((current[:number] || current["number"]).to_s)
    +  end
    +end
    +
    +
    + +
    +

    + + .appraisal_latest_version_matching(version_metadata, requested_version) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2552
    +2553
    +2554
    +2555
    +2556
    +2557
    +2558
    +
    +
    # File 'lib/kettle/jem.rb', line 2552
    +
    +def appraisal_latest_version_matching(, requested_version)
    +  prefix = "#{requested_version}."
    +  .select do |entry|
    +    number = (entry[:number] || entry["number"]).to_s
    +    number == requested_version.to_s || number.start_with?(prefix)
    +  end.max_by { |entry| Gem::Version.new((entry[:number] || entry["number"]).to_s) }
    +end
    +
    +
    + +
    +

    + + .appraisal_matrix_entries(tier1_gems:, tier2_gems: []) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2302
    +2303
    +2304
    +2305
    +2306
    +2307
    +2308
    +2309
    +2310
    +2311
    +2312
    +2313
    +2314
    +2315
    +2316
    +2317
    +2318
    +2319
    +2320
    +2321
    +2322
    +2323
    +2324
    +2325
    +2326
    +2327
    +2328
    +2329
    +2330
    +2331
    +2332
    +2333
    +
    +
    # File 'lib/kettle/jem.rb', line 2302
    +
    +def appraisal_matrix_entries(tier1_gems:, tier2_gems: [])
    +  entries = []
    +  tier1_gems.each do |tier1|
    +    tier1_name = tier1[:name] || tier1["name"]
    +    assignments = tier1[:assignments] || tier1["assignments"] || []
    +    assignments.each do |assignment|
    +      tier1_version = assignment[:version] || assignment["version"]
    +      ruby_series = assignment[:bucket] || assignment["bucket"] || assignment[:ruby_series] || assignment["ruby_series"]
    +      if tier2_gems.empty?
    +        entries << appraisal_matrix_entry(
    +          tier1_name: tier1_name,
    +          tier1_version: tier1_version,
    +          ruby_series: ruby_series
    +        )
    +      else
    +        tier2_gems.each do |tier2|
    +          tier2_name = tier2[:name] || tier2["name"]
    +          Array(tier2[:versions] || tier2["versions"]).each do |tier2_version|
    +            entries << appraisal_matrix_entry(
    +              tier1_name: tier1_name,
    +              tier1_version: tier1_version,
    +              ruby_series: ruby_series,
    +              tier2_name: tier2_name,
    +              tier2_version: tier2_version
    +            )
    +          end
    +        end
    +      end
    +    end
    +  end
    +  entries
    +end
    +
    +
    + +
    +

    + + .appraisal_matrix_entry(tier1_name:, tier1_version:, ruby_series:, tier2_name: nil, tier2_version: nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2335
    +2336
    +2337
    +2338
    +2339
    +2340
    +2341
    +2342
    +2343
    +2344
    +2345
    +2346
    +2347
    +2348
    +2349
    +
    +
    # File 'lib/kettle/jem.rb', line 2335
    +
    +def appraisal_matrix_entry(tier1_name:, tier1_version:, ruby_series:, tier2_name: nil, tier2_version: nil)
    +  {
    +    name: appraisal_name(
    +      tier1_gem: tier1_name,
    +      tier1_version: tier1_version,
    +      tier2_gem: tier2_name,
    +      tier2_version: tier2_version,
    +      ruby_series: ruby_series
    +    ),
    +    tier1_gemfile: appraisal_modular_gemfile_path(gem_name: tier1_name, version: tier1_version, ruby_series: ruby_series),
    +    tier2_gemfile: tier2_name ? appraisal_modular_gemfile_path(gem_name: tier2_name, version: tier2_version, ruby_series: ruby_series) : nil,
    +    x_std_libs_gemfile: File.join("gemfiles", "modular", "x_std_libs", ruby_series.to_s, "libs.gemfile"),
    +    ruby_series: ruby_series.to_s
    +  }
    +end
    +
    +
    + +
    +

    + + .appraisal_matrix_fresh?(matrix, now: Time.now.to_i) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +2618
    +2619
    +2620
    +2621
    +2622
    +2623
    +2624
    +
    +
    # File 'lib/kettle/jem.rb', line 2618
    +
    +def appraisal_matrix_fresh?(matrix, now: Time.now.to_i)
    +  resolved_at = (matrix || {})[:resolved_at] || (matrix || {})["resolved_at"]
    +  return false unless resolved_at
    +
    +  ttl = (matrix || {})[:freshness_ttl] || (matrix || {})["freshness_ttl"] || APPRAISAL_DEFAULT_FRESHNESS_TTL
    +  (now.to_i - resolved_at.to_i) < ttl.to_i
    +end
    +
    +
    + +
    +

    + + .appraisal_matrix_has_versions?(matrix) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +2611
    +2612
    +2613
    +2614
    +2615
    +2616
    +
    +
    # File 'lib/kettle/jem.rb', line 2611
    +
    +def appraisal_matrix_has_versions?(matrix)
    +  gems = deep_string_key_hash(matrix || {}).fetch("gems", {})
    +  %w[tier1 tier2].any? do |tier|
    +    Array(gems[tier]).any? { |gem_config| Array(gem_config["versions"]).any? }
    +  end
    +end
    +
    +
    + +
    +

    + + .appraisal_minor_key(version) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2455
    +2456
    +2457
    +2458
    +
    +
    # File 'lib/kettle/jem.rb', line 2455
    +
    +def appraisal_minor_key(version)
    +  segments = Gem::Version.new(version.to_s).segments
    +  "#{segments[0]}.#{segments[1] || 0}"
    +end
    +
    +
    + +
    +

    + + .appraisal_minor_versions_by_major(versions) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2363
    +2364
    +2365
    +2366
    +2367
    +2368
    +2369
    +2370
    +2371
    +2372
    +2373
    +2374
    +2375
    +2376
    +2377
    +
    +
    # File 'lib/kettle/jem.rb', line 2363
    +
    +def appraisal_minor_versions_by_major(versions)
    +  versions.map do |version|
    +    gem_version = Gem::Version.new(version)
    +    segments = gem_version.segments
    +    {
    +      major: segments[0],
    +      minor: "#{segments[0]}.#{segments[1] || 0}"
    +    }
    +  end.uniq.group_by { |entry| entry.fetch(:major) }.map do |major, entries|
    +    {
    +      major: major,
    +      minors: entries.map { |entry| entry.fetch(:minor) }.sort_by { |minor| Gem::Version.new(minor) }
    +    }
    +  end.sort_by { |entry| entry.fetch(:major) }
    +end
    +
    +
    + +
    +

    + + .appraisal_minor_versions_to_buckets(minor_versions) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2433
    +2434
    +2435
    +2436
    +2437
    +2438
    +2439
    +2440
    +2441
    +2442
    +2443
    +2444
    +2445
    +2446
    +2447
    +2448
    +2449
    +2450
    +2451
    +2452
    +2453
    +
    +
    # File 'lib/kettle/jem.rb', line 2433
    +
    +def appraisal_minor_versions_to_buckets(minor_versions)
    +  by_major = minor_versions.group_by { |minor| minor.split(".").first.to_i }
    +  buckets = []
    +  ranges = {}
    +  by_major.each do |major, minors|
    +    sorted = minors.sort_by { |minor| Gem::Version.new(minor) }
    +    sorted.each_with_index do |minor, index|
    +      bucket = (index == sorted.length - 1) ? "r#{major}" : "r#{major}.#{[sorted[index + 1].split(".").last.to_i - 1, minor.split(".").last.to_i].max}"
    +      next if ranges.key?(bucket)
    +
    +      buckets << bucket
    +      ceiling = if index == sorted.length - 1
    +        "#{major}.99"
    +      else
    +        bucket.split(".").last ? "#{major}.#{bucket.split(".").last}" : "#{major}.99"
    +      end
    +      ranges[bucket] = {floor: Gem::Version.new(minor), ceiling: Gem::Version.new(ceiling)}
    +    end
    +  end
    +  {buckets: buckets.sort_by { |bucket| appraisal_bucket_sort_key(bucket) }, bucket_ranges: ranges}
    +end
    +
    +
    + +
    +

    + + .appraisal_modular_gemfile_content(gem_name:, version:, sub_dependencies: {}) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2168
    +2169
    +2170
    +2171
    +2172
    +2173
    +2174
    +2175
    +2176
    +2177
    +2178
    +2179
    +2180
    +
    +
    # File 'lib/kettle/jem.rb', line 2168
    +
    +def appraisal_modular_gemfile_content(gem_name:, version:, sub_dependencies: {})
    +  lines = [
    +    "# frozen_string_literal: true",
    +    "",
    +    "# Generated by kettle-jem",
    +    "",
    +    %(gem "#{gem_name}", "#{appraisal_version_requirement(version)}")
    +  ]
    +  sub_dependencies.each do |name, requirement|
    +    lines << %(gem "#{name}", "~> #{requirement}")
    +  end
    +  ensure_trailing_newline(lines.join("\n"))
    +end
    +
    +
    + +
    +

    + + .appraisal_modular_gemfile_path(gem_name:, version:, ruby_series:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2164
    +2165
    +2166
    +
    +
    # File 'lib/kettle/jem.rb', line 2164
    +
    +def appraisal_modular_gemfile_path(gem_name:, version:, ruby_series:)
    +  File.join("gemfiles", "modular", gem_name.to_s, ruby_series.to_s, "v#{version}.gemfile")
    +end
    +
    +
    + +
    +

    + + .appraisal_name(tier1_gem:, tier1_version:, ruby_series:, tier2_gem: nil, tier2_version: nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2150
    +2151
    +2152
    +2153
    +2154
    +2155
    +2156
    +2157
    +2158
    +2159
    +2160
    +2161
    +2162
    +
    +
    # File 'lib/kettle/jem.rb', line 2150
    +
    +def appraisal_name(tier1_gem:, tier1_version:, ruby_series:, tier2_gem: nil, tier2_version: nil)
    +  parts = [
    +    APPRAISAL_NAME_PREFIX,
    +    appraisal_gem_abbreviation(tier1_gem),
    +    appraisal_format_version(tier1_version)
    +  ]
    +  unless tier2_gem.to_s.empty?
    +    parts << appraisal_gem_abbreviation(tier2_gem)
    +    parts << appraisal_format_version(tier2_version)
    +  end
    +  parts << ruby_series.to_s
    +  parts.join("-")
    +end
    +
    +
    + +
    +

    + + .appraisal_names(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4834
    +4835
    +4836
    +
    +
    # File 'lib/kettle/jem.rb', line 4834
    +
    +def appraisal_names(content)
    +  appraisal_call_records(content).map { |record| record.fetch(:name) }
    +end
    +
    +
    + +
    +

    + + .appraisal_next_seam_ruby(version, min_ruby, all_versions, version_min_rubies) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2488
    +2489
    +2490
    +2491
    +2492
    +2493
    +2494
    +2495
    +2496
    +2497
    +2498
    +
    +
    # File 'lib/kettle/jem.rb', line 2488
    +
    +def appraisal_next_seam_ruby(version, min_ruby, all_versions, version_min_rubies)
    +  found = false
    +  all_versions.sort_by { |candidate| Gem::Version.new(candidate) }.each do |candidate|
    +    found ||= Gem::Version.new(candidate) >= Gem::Version.new(version)
    +    next unless found
    +
    +    candidate_ruby = version_min_rubies[candidate]
    +    return candidate_ruby if candidate_ruby && candidate_ruby > min_ruby
    +  end
    +  nil
    +end
    +
    +
    + +
    +

    + + .appraisal_normalized_bucket_ranges(bucket_ranges) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2465
    +2466
    +2467
    +2468
    +2469
    +2470
    +2471
    +2472
    +
    +
    # File 'lib/kettle/jem.rb', line 2465
    +
    +def appraisal_normalized_bucket_ranges(bucket_ranges)
    +  bucket_ranges.transform_values do |range|
    +    {
    +      floor: Gem::Version.new((range[:floor] || range["floor"]).to_s),
    +      ceiling: Gem::Version.new((range[:ceiling] || range["ceiling"]).to_s)
    +    }
    +  end
    +end
    +
    +
    + +
    +

    + + .appraisal_recording_enabled?(config) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +13876
    +13877
    +13878
    +13879
    +13880
    +13881
    +
    +
    # File 'lib/kettle/jem.rb', line 13876
    +
    +def appraisal_recording_enabled?(config)
    +  workflows = config["workflows"]
    +  workflows = {} unless workflows.is_a?(Hash)
    +
    +  DecisionPolicy.value_to_boolean(workflows["recording"]) == true
    +end
    +
    +
    + +
    +

    + + .appraisal_resolve_sub_dependencies(parent_gem:, parent_version:, parent_versions:, dependency_versions:, ruby_min: nil, excluded_gems: []) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2528
    +2529
    +2530
    +2531
    +2532
    +2533
    +2534
    +2535
    +2536
    +2537
    +2538
    +2539
    +2540
    +2541
    +2542
    +2543
    +2544
    +2545
    +2546
    +2547
    +2548
    +2549
    +2550
    +
    +
    # File 'lib/kettle/jem.rb', line 2528
    +
    +def appraisal_resolve_sub_dependencies(parent_gem:, parent_version:, parent_versions:, dependency_versions:, ruby_min: nil, excluded_gems: [])
    +  parent = appraisal_latest_version_matching(parent_versions, parent_version)
    +  return {} unless parent
    +
    +  ruby_floor = Gem::Version.new(ruby_min.to_s) unless ruby_min.to_s.empty?
    +  excluded = excluded_gems.map(&:to_s)
    +  Array(parent[:runtime_dependencies] || parent["runtime_dependencies"]).each_with_object({}) do |dependency, resolved|
    +    name = (dependency[:name] || dependency["name"]).to_s
    +    next if name.empty? || excluded.include?(name)
    +
    +    requirement = begin
    +      Gem::Requirement.new(dependency[:requirements] || dependency["requirements"] || ">= 0")
    +    rescue ArgumentError
    +      Gem::Requirement.default
    +    end
    +    selected = appraisal_select_dependency_version(
    +      Array(dependency_versions[name] || dependency_versions[name.to_sym]),
    +      requirement: requirement,
    +      ruby_min: ruby_floor
    +    )
    +    resolved[name] = selected if selected
    +  end
    +end
    +
    +
    + +
    +

    + + .appraisal_ruby_series(version_metadata, project_min_ruby: nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2394
    +2395
    +2396
    +2397
    +2398
    +2399
    +2400
    +2401
    +2402
    +2403
    +
    +
    # File 'lib/kettle/jem.rb', line 2394
    +
    +def appraisal_ruby_series(, project_min_ruby: nil)
    +  floors = appraisal_find_ruby_seams().map { |seam| seam.fetch(:min_ruby) }
    +  if project_min_ruby
    +    floor = Gem::Version.new(project_min_ruby.to_s)
    +    floors.reject! { |version| version < floor }
    +    floors << floor unless floors.include?(floor)
    +  end
    +  floors = [Gem::Version.new("3.2")] if floors.empty?
    +  appraisal_minor_versions_to_buckets(floors.map { |version| appraisal_minor_key(version) }.uniq.sort)
    +end
    +
    +
    + +
    +

    + + .appraisal_ruby_version(value) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +6353
    +6354
    +6355
    +6356
    +6357
    +6358
    +6359
    +6360
    +6361
    +6362
    +
    +
    # File 'lib/kettle/jem.rb', line 6353
    +
    +def appraisal_ruby_version(value)
    +  parts = value.to_s.split("-")
    +  return unless parts.length == 3 && parts.first == "ruby"
    +
    +  major = Integer(parts[1], exception: false)
    +  minor = Integer(parts[2], exception: false)
    +  return unless major && minor
    +
    +  "#{major}.#{minor}"
    +end
    +
    +
    + +
    +

    + + .appraisal_scaffold_config(gemspec_content:, existing_config: {}, exclusions: [], default_mode: "semver", freshness_ttl: APPRAISAL_DEFAULT_FRESHNESS_TTL) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2594
    +2595
    +2596
    +2597
    +2598
    +2599
    +2600
    +2601
    +2602
    +2603
    +2604
    +2605
    +2606
    +2607
    +2608
    +2609
    +
    +
    # File 'lib/kettle/jem.rb', line 2594
    +
    +def appraisal_scaffold_config(gemspec_content:, existing_config: {}, exclusions: [], default_mode: "semver", freshness_ttl: APPRAISAL_DEFAULT_FRESHNESS_TTL)
    +  excluded = exclusions.map(&:to_s).to_set
    +  runtime_dependencies = appraisal_extract_runtime_dependencies(gemspec_content)
    +  tier1 = runtime_dependencies.reject { |name| excluded.include?(name) }.map { |name| {"name" => name} }
    +  config = deep_string_key_hash(existing_config)
    +  matrix = config["appraisal_matrix"] || {}
    +  gems = matrix["gems"] || {}
    +
    +  matrix["mode"] ||= default_mode
    +  matrix["freshness_ttl"] ||= freshness_ttl
    +  gems["tier1"] = tier1
    +  gems["tier2"] ||= []
    +  matrix["gems"] = gems
    +  config["appraisal_matrix"] = matrix
    +  config
    +end
    +
    +
    + +
    +

    + + .appraisal_select_dependency_version(version_metadata, requirement:, ruby_min:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2560
    +2561
    +2562
    +2563
    +2564
    +2565
    +2566
    +2567
    +2568
    +2569
    +2570
    +2571
    +2572
    +2573
    +2574
    +2575
    +
    +
    # File 'lib/kettle/jem.rb', line 2560
    +
    +def appraisal_select_dependency_version(, requirement:, ruby_min:)
    +  compatible = .select do |entry|
    +    number = (entry[:number] || entry["number"]).to_s
    +    !number.empty? && requirement.satisfied_by?(Gem::Version.new(number))
    +  end.sort_by { |entry| Gem::Version.new((entry[:number] || entry["number"]).to_s) }
    +  return if compatible.empty?
    +
    +  if ruby_min
    +    selected = compatible.reverse.find do |entry|
    +      min_ruby = entry[:min_ruby] || entry["min_ruby"]
    +      min_ruby.to_s.empty? || Gem::Version.new(min_ruby.to_s) <= ruby_min
    +    end
    +    return (selected || compatible.first).then { |entry| entry[:number] || entry["number"] }
    +  end
    +  compatible.last.then { |entry| entry[:number] || entry["number"] }
    +end
    +
    +
    + +
    +

    + + .appraisal_select_versions(version_metadata, mode:, requirements: nil) ⇒ Object + + + + + +

    +
    + + + +
    +
    +
    + +

    Raises:

    +
      + +
    • + + + (ArgumentError) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +2274
    +2275
    +2276
    +2277
    +2278
    +2279
    +2280
    +2281
    +2282
    +2283
    +2284
    +2285
    +2286
    +2287
    +2288
    +2289
    +2290
    +2291
    +2292
    +2293
    +2294
    +2295
    +2296
    +2297
    +2298
    +2299
    +2300
    +
    +
    # File 'lib/kettle/jem.rb', line 2274
    +
    +def appraisal_select_versions(, mode:, requirements: nil)
    +  mode = mode.to_s
    +  raise ArgumentError, "invalid appraisal version selection mode: #{mode}" unless APPRAISAL_VERSION_SELECTION_MODES.include?(mode)
    +
    +  versions = appraisal_filtered_versions(, requirements: requirements)
    +  return versions if mode == "patch"
    +
    +  by_major = appraisal_minor_versions_by_major(versions)
    +  return [] if by_major.empty?
    +
    +  current_major = by_major.last.fetch(:major)
    +  case mode
    +  when "major"
    +    by_major.map { |entry| entry.fetch(:minors).last }
    +  when "minor"
    +    by_major.flat_map { |entry| entry.fetch(:minors) }
    +  when "minor-minmax"
    +    by_major.flat_map do |entry|
    +      minors = entry.fetch(:minors)
    +      (entry.fetch(:major) < current_major) ? [minors.first, minors.last].uniq : minors
    +    end
    +  when "semver"
    +    by_major.flat_map do |entry|
    +      (entry.fetch(:major) < current_major) ? [entry.fetch(:minors).last] : entry.fetch(:minors)
    +    end
    +  end
    +end
    +
    +
    + +
    +

    + + .appraisal_sort_versions(values) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2678
    +2679
    +2680
    +
    +
    # File 'lib/kettle/jem.rb', line 2678
    +
    +def appraisal_sort_versions(values)
    +  values.compact.map(&:to_s).reject(&:empty?).uniq.sort_by { |version| Gem::Version.new(version) }
    +end
    +
    +
    + +
    +

    + + .appraisal_stale_gemfile_paths(existing_paths:, current_entries:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2577
    +2578
    +2579
    +2580
    +2581
    +2582
    +2583
    +2584
    +2585
    +
    +
    # File 'lib/kettle/jem.rb', line 2577
    +
    +def appraisal_stale_gemfile_paths(existing_paths:, current_entries:)
    +  current_names = current_entries.map { |entry| (entry[:name] || entry["name"]).to_s }.to_set
    +  existing_paths.map(&:to_s).select do |path|
    +    basename = File.basename(path, ".gemfile")
    +    path.start_with?("gemfiles/#{APPRAISAL_NAME_PREFIX}-") &&
    +      path.end_with?(".gemfile") &&
    +      !current_names.include?(basename)
    +  end.sort
    +end
    +
    +
    + +
    +

    + + .appraisal_time_ago(timestamp, now: Time.now.to_i) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2626
    +2627
    +2628
    +2629
    +2630
    +2631
    +2632
    +2633
    +2634
    +
    +
    # File 'lib/kettle/jem.rb', line 2626
    +
    +def appraisal_time_ago(timestamp, now: Time.now.to_i)
    +  return "unknown" unless timestamp
    +
    +  seconds = now.to_i - timestamp.to_i
    +  return "#{seconds / 60}m" if seconds < 3600
    +  return "#{seconds / 3600}h" if seconds < 86_400
    +
    +  "#{seconds / 86_400}d"
    +end
    +
    +
    + +
    +

    + + .appraisal_version_min_ruby_map(all_versions, seams) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2474
    +2475
    +2476
    +2477
    +2478
    +2479
    +2480
    +2481
    +2482
    +2483
    +2484
    +2485
    +2486
    +
    +
    # File 'lib/kettle/jem.rb', line 2474
    +
    +def appraisal_version_min_ruby_map(all_versions, seams)
    +  sorted_seams = seams.sort_by { |seam| Gem::Version.new(seam[:version] || seam["version"]) }
    +  seam_index = 0
    +  current = nil
    +  all_versions.sort_by { |version| Gem::Version.new(version) }.each_with_object({}) do |version, map|
    +    while seam_index < sorted_seams.length && Gem::Version.new(sorted_seams[seam_index][:version] || sorted_seams[seam_index]["version"]) <= Gem::Version.new(version)
    +      current = Gem::Version.new((sorted_seams[seam_index][:min_ruby] || sorted_seams[seam_index]["min_ruby"]).to_s)
    +      current = [current, DEFAULT_TEST_MINIMUM_RUBY].max
    +      seam_index += 1
    +    end
    +    map[version] = current if current
    +  end
    +end
    +
    +
    + +
    +

    + + .appraisal_version_requirement(version) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2182
    +2183
    +2184
    +2185
    +
    +
    # File 'lib/kettle/jem.rb', line 2182
    +
    +def appraisal_version_requirement(version)
    +  segments = version.to_s.split(".")
    +  (segments.length >= 3) ? "~> #{version}" : "~> #{version}.0"
    +end
    +
    +
    + +
    +

    + + .appraisal_workflow_groups(matrix_entries, bucket_ranges:, exec_cmd: "kettle-test") ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2211
    +2212
    +2213
    +2214
    +2215
    +2216
    +2217
    +2218
    +2219
    +2220
    +2221
    +2222
    +2223
    +2224
    +2225
    +2226
    +2227
    +2228
    +2229
    +2230
    +2231
    +2232
    +2233
    +2234
    +
    +
    # File 'lib/kettle/jem.rb', line 2211
    +
    +def appraisal_workflow_groups(matrix_entries, bucket_ranges:, exec_cmd: "kettle-test")
    +  grouped = Hash.new { |hash, key| hash[key] = [] }
    +  normalized_ranges = bucket_ranges.transform_values do |range|
    +    {
    +      floor: Gem::Version.new((range[:floor] || range["floor"]).to_s),
    +      ceiling: Gem::Version.new((range[:ceiling] || range["ceiling"]).to_s)
    +    }
    +  end
    +  matrix_entries.each do |entry|
    +    ruby_series = entry[:ruby_series] || entry["ruby_series"]
    +    range = normalized_ranges[ruby_series]
    +    next unless range
    +
    +    lifecycle = appraisal_workflow_lifecycle(range.fetch(:floor))
    +    grouped[lifecycle] << {
    +      ruby: appraisal_workflow_ruby(range.fetch(:floor), lifecycle),
    +      appraisal: entry[:name] || entry["name"],
    +      exec_cmd: exec_cmd,
    +      rubygems: "latest",
    +      bundler: "latest"
    +    }
    +  end
    +  grouped.transform_values { |entries| entries.sort_by { |entry| entry.fetch(:appraisal).to_s } }
    +end
    +
    +
    + +
    +

    + + .appraisal_workflow_lifecycle(ruby_floor) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2250
    +2251
    +2252
    +2253
    +2254
    +2255
    +
    +
    # File 'lib/kettle/jem.rb', line 2250
    +
    +def appraisal_workflow_lifecycle(ruby_floor)
    +  APPRAISAL_WORKFLOW_LIFECYCLE_RANGES.each do |name, range|
    +    return name if ruby_floor.between?(range.fetch(:min), range.fetch(:max))
    +  end
    +  (ruby_floor < APPRAISAL_WORKFLOW_LIFECYCLE_RANGES.fetch("ancient").fetch(:min)) ? "ancient" : "current"
    +end
    +
    +
    + +
    +

    + + .appraisal_workflow_ruby(ruby_floor, lifecycle) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2257
    +2258
    +2259
    +2260
    +2261
    +2262
    +
    +
    # File 'lib/kettle/jem.rb', line 2257
    +
    +def appraisal_workflow_ruby(ruby_floor, lifecycle)
    +  return "ruby" if lifecycle == "current"
    +
    +  segments = ruby_floor.segments
    +  "#{segments[0]}.#{segments[1] || 0}"
    +end
    +
    +
    + +
    +

    + + .appraisal_workflow_yaml_snippets(matrix_entries, bucket_ranges:, exec_cmd: "kettle-test") ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2236
    +2237
    +2238
    +2239
    +2240
    +2241
    +2242
    +2243
    +2244
    +2245
    +2246
    +2247
    +2248
    +
    +
    # File 'lib/kettle/jem.rb', line 2236
    +
    +def appraisal_workflow_yaml_snippets(matrix_entries, bucket_ranges:, exec_cmd: "kettle-test")
    +  appraisal_workflow_groups(matrix_entries, bucket_ranges: bucket_ranges, exec_cmd: exec_cmd).transform_values do |entries|
    +    lines = ["strategy:", "  matrix:", "    include:"]
    +    entries.each do |entry|
    +      lines << %(      - ruby: "#{entry.fetch(:ruby)}")
    +      lines << %(        appraisal: "#{entry.fetch(:appraisal)}")
    +      lines << %(        exec_cmd: "#{entry.fetch(:exec_cmd)}")
    +      lines << %(        rubygems: "#{entry.fetch(:rubygems)}")
    +      lines << %(        bundler: "#{entry.fetch(:bundler)}")
    +    end
    +    lines.join("\n")
    +  end
    +end
    +
    +
    + +
    +

    + + .appraisal_x_stdlib_eval_gemfile_call(block) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +7059
    +7060
    +7061
    +7062
    +7063
    +
    +
    # File 'lib/kettle/jem.rb', line 7059
    +
    +def appraisal_x_stdlib_eval_gemfile_call(block)
    +  ruby_call_records(block, :eval_gemfile).find do |call|
    +    ruby_string_argument(call).to_s.start_with?("modular/x_std_libs")
    +  end
    +end
    +
    +
    + +
    +

    + + .appraisal_x_stdlib_exclusions(template_content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2264
    +2265
    +2266
    +2267
    +2268
    +2269
    +2270
    +2271
    +2272
    +
    +
    # File 'lib/kettle/jem.rb', line 2264
    +
    +def appraisal_x_stdlib_exclusions(template_content)
    +  gems = ruby_call_records(template_content, :eval_gemfile).filter_map do |call|
    +    path = ruby_string_argument(call).to_s
    +    next unless path.start_with?("../")
    +
    +    path.delete_prefix("../").split("/").first
    +  end
    +  (gems + APPRAISAL_ALWAYS_EXCLUDED_GEMS).uniq.sort
    +end
    +
    +
    + +
    +

    + + .appraisals_policy_operations(template_content, original, final, request) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4703
    +4704
    +4705
    +4706
    +4707
    +4708
    +4709
    +4710
    +4711
    +4712
    +4713
    +4714
    +4715
    +4716
    +4717
    +4718
    +4719
    +4720
    +4721
    +4722
    +4723
    +
    +
    # File 'lib/kettle/jem.rb', line 4703
    +
    +def appraisals_policy_operations(template_content, original, final, request)
    +  package_name = runtime_context_value(request, :package, :name).to_s
    +  min_ruby = minimum_ruby_token(runtime_context_value(request, :ci, :test_min_ruby) || runtime_context_value(request, :rubygems, :min_ruby))
    +  source = "#{template_content}\n#{original}"
    +  [
    +    {
    +      operation: "merge_appraisal_blocks",
    +      inserted_appraisals: (appraisal_names(template_content) - appraisal_names(original)).sort,
    +      preserved_destination_appraisals: (appraisal_names(original) - appraisal_names(template_content) & appraisal_names(final)).sort
    +    },
    +    {
    +      operation: "delete_self_dependency_declarations",
    +      deleted_dependency_count: [gemfile_dependency_names(source).count(package_name) - gemfile_dependency_names(final).count(package_name), 0].max
    +    },
    +    {
    +      operation: "prune_minimum_ruby_appraisals",
    +      min_ruby: min_ruby,
    +      deleted_appraisals: (ruby_appraisal_names_below(original, min_ruby) - appraisal_names(final)).sort
    +    }
    +  ]
    +end
    +
    +
    + +
    +

    + + .author_facts(config, env, gemspec_metadata: {}, copyright: {}) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +10607
    +10608
    +10609
    +10610
    +10611
    +10612
    +10613
    +10614
    +10615
    +10616
    +10617
    +10618
    +10619
    +10620
    +10621
    +10622
    +10623
    +10624
    +10625
    +10626
    +10627
    +
    +
    # File 'lib/kettle/jem.rb', line 10607
    +
    +def author_facts(config, env, gemspec_metadata: {}, copyright: {})
    +  token_config = token_config_values(config)
    +  author_config = token_config["author"].is_a?(Hash) ? token_config["author"] : {}
    +  derived_name = Array([:authors]).map(&:to_s).find { |value| present_template_token_value?(value) }
    +  derived_email = Array([:email]).map(&:to_s).find { |value| present_template_token_value?(value) }
    +  name = preferred_template_token_value(derived_name, author_config["name"], env, "KJ_AUTHOR_NAME").to_s
    +  email = preferred_template_token_value(derived_email, author_config["email"], env, "KJ_AUTHOR_EMAIL").to_s
    +  given_names = preferred_template_token_value(author_given_names(name), author_config["given_names"], env, "KJ_AUTHOR_GIVEN_NAMES")
    +  family_names = preferred_template_token_value(author_family_names(name), author_config["family_names"], env, "KJ_AUTHOR_FAMILY_NAMES")
    +  domain = preferred_template_token_value(email.split("@", 2)[1], author_config["domain"], env, "KJ_AUTHOR_DOMAIN")
    +  orcid = preferred_template_token_value(nil, author_config["orcid"], env, "KJ_AUTHOR_ORCID")
    +  compact_hash(
    +    name: name,
    +    names: author_names(, copyright, name),
    +    given_names: given_names.to_s,
    +    family_names: family_names.to_s,
    +    email: email,
    +    domain: domain.to_s,
    +    orcid: orcid.to_s
    +  )
    +end
    +
    +
    + +
    +

    + + .author_family_names(name) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +12653
    +12654
    +12655
    +12656
    +12657
    +12658
    +
    +
    # File 'lib/kettle/jem.rb', line 12653
    +
    +def author_family_names(name)
    +  parts = name.to_s.strip.split(/\s+/)
    +  return "" if parts.size < 2
    +
    +  parts[-1]
    +end
    +
    +
    + +
    +

    + + .author_given_names(name) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +12646
    +12647
    +12648
    +12649
    +12650
    +12651
    +
    +
    # File 'lib/kettle/jem.rb', line 12646
    +
    +def author_given_names(name)
    +  parts = name.to_s.strip.split(/\s+/)
    +  return "" if parts.size < 2
    +
    +  parts[0...-1].join(" ")
    +end
    +
    +
    + +
    +

    + + .author_names(gemspec_metadata, copyright, primary_name) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +10668
    +10669
    +10670
    +10671
    +10672
    +10673
    +10674
    +
    +
    # File 'lib/kettle/jem.rb', line 10668
    +
    +def author_names(, copyright, primary_name)
    +  names = Array([:authors]).map(&:to_s)
    +  names = names.select { |name| present_template_token_value?(name) }
    +  names = copyright_author_names(copyright) if names.empty?
    +  names = [primary_name.to_s] if names.empty?
    +  names.map(&:strip).reject(&:empty?).uniq
    +end
    +
    +
    + +
    +

    + + .author_template_tokens(author) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +10654
    +10655
    +10656
    +10657
    +10658
    +10659
    +10660
    +10661
    +10662
    +10663
    +10664
    +10665
    +10666
    +
    +
    # File 'lib/kettle/jem.rb', line 10654
    +
    +def author_template_tokens(author)
    +  names = Array(author[:names]).map(&:to_s).reject(&:empty?)
    +  names = [author[:name].to_s] if names.empty?
    +  {
    +    "KJ|AUTHOR:NAME" => author[:name].to_s,
    +    "KJ|AUTHOR:NAMES" => ruby_array_literal(names),
    +    "KJ|AUTHOR:GIVEN_NAMES" => author[:given_names].to_s,
    +    "KJ|AUTHOR:FAMILY_NAMES" => author[:family_names].to_s,
    +    "KJ|AUTHOR:EMAIL" => author[:email].to_s,
    +    "KJ|AUTHOR:DOMAIN" => author[:domain].to_s,
    +    "KJ|AUTHOR:ORCID" => author[:orcid].to_s
    +  }
    +end
    +
    +
    + +
    +

    + + .bash_merge_options(recipe) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +7224
    +7225
    +7226
    +7227
    +7228
    +7229
    +7230
    +7231
    +7232
    +7233
    +7234
    +7235
    +
    +
    # File 'lib/kettle/jem.rb', line 7224
    +
    +def bash_merge_options(recipe)
    +  options = {
    +    preference: (recipe.dig(:template_preference, :preference) || "destination").to_sym,
    +    add_template_only_nodes: true,
    +    freeze_token: recipe.dig(:template_preference, :freeze_token) || "kettle-jem"
    +  }
    +  if !recipe.dig(:template_preference, :add_template_only_nodes).nil?
    +    configured = DecisionPolicy.value_to_boolean(recipe.dig(:template_preference, :add_template_only_nodes))
    +    options[:add_template_only_nodes] = configured unless configured.nil?
    +  end
    +  options
    +end
    +
    +
    + +
    +

    + + .build_changelog_unreleased_section(heading, items) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4369
    +4370
    +4371
    +4372
    +4373
    +4374
    +4375
    +4376
    +4377
    +4378
    +4379
    +4380
    +4381
    +
    +
    # File 'lib/kettle/jem.rb', line 4369
    +
    +def build_changelog_unreleased_section(heading, items)
    +  lines = [heading]
    +  CHANGELOG_STANDARD_HEADINGS.each do |standard_heading|
    +    lines << ""
    +    lines << standard_heading
    +    lines << ""
    +    section_items = items[standard_heading].to_a.dup
    +    section_items.pop while section_items.any? && section_items.last.to_s.strip.empty?
    +    lines.concat(section_items) if section_items.any?
    +  end
    +  lines << ""
    +  lines
    +end
    +
    +
    + +
    +

    + + .changed_files_from_recipe_reports(recipe_reports) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3457
    +3458
    +3459
    +3460
    +3461
    +3462
    +3463
    +3464
    +
    +
    # File 'lib/kettle/jem.rb', line 3457
    +
    +def changed_files_from_recipe_reports(recipe_reports)
    +  latest_by_path = {}
    +  recipe_reports.each do |report|
    +    path = report[:relative_path]
    +    latest_by_path[path] = report if path
    +  end
    +  latest_by_path.values.filter_map { |report| report[:relative_path] if report[:changed] }.uniq.sort
    +end
    +
    +
    + +
    +

    + + .changelog_bullet_line?(line) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +4446
    +4447
    +4448
    +4449
    +
    +
    # File 'lib/kettle/jem.rb', line 4446
    +
    +def changelog_bullet_line?(line)
    +  stripped = line.to_s.lstrip
    +  stripped.start_with?("- ", "* ")
    +end
    +
    +
    + +
    +

    + + .changelog_coverage_kloc(section) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5160
    +5161
    +5162
    +5163
    +5164
    +5165
    +5166
    +5167
    +
    +
    # File 'lib/kettle/jem.rb', line 5160
    +
    +def changelog_coverage_kloc(section)
    +  return if section.to_s.empty?
    +
    +  match = section.to_s.match(/-\s*COVERAGE:\s*.+--\s*\d+\/(\d+)\s+lines/i)
    +  return unless match
    +
    +  format("%.3f", match[1].to_i.to_f / 1000.0)
    +end
    +
    +
    + +
    +

    + + .changelog_template_header(lines, unreleased_index) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4310
    +4311
    +4312
    +4313
    +4314
    +
    +
    # File 'lib/kettle/jem.rb', line 4310
    +
    +def changelog_template_header(lines, unreleased_index)
    +  header = lines[0...unreleased_index].to_a
    +  header.pop while header.any? && header.last.to_s.strip.empty?
    +  header
    +end
    +
    +
    + +
    +

    + + .changelog_transfer_entries(template_root) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4383
    +4384
    +4385
    +4386
    +4387
    +4388
    +4389
    +4390
    +4391
    +4392
    +4393
    +4394
    +4395
    +4396
    +4397
    +4398
    +4399
    +4400
    +4401
    +4402
    +4403
    +4404
    +
    +
    # File 'lib/kettle/jem.rb', line 4383
    +
    +def changelog_transfer_entries(template_root)
    +  path = File.join(template_root, TRANSFER_CHANGELOG_TEMPLATE_PATH)
    +  return [] unless File.file?(path)
    +
    +  lines = markdown_source_lines(File.read(path))
    +  entries = []
    +  index = 0
    +  while index < lines.length
    +    line = lines.fetch(index)
    +    unless changelog_bullet_line?(line)
    +      index += 1
    +      next
    +    end
    +
    +    item_lines, index = collect_changelog_list_item(lines, index)
    +    key = changelog_transfer_key(item_lines.first)
    +    next unless key
    +
    +    entries << {key: key, lines: item_lines}
    +  end
    +  entries
    +end
    +
    +
    + +
    +

    + + .changelog_transfer_key(line) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4406
    +4407
    +4408
    +4409
    +
    +
    # File 'lib/kettle/jem.rb', line 4406
    +
    +def changelog_transfer_key(line)
    +  key = line.to_s.lstrip.delete_prefix("- ").delete_prefix("* ").split(/\s+-\s+/, 2).first.to_s
    +  key.match?(/\Akettle-jem-template-\d{8}-\d{3}\z/) ? key : nil
    +end
    +
    +
    + +
    +

    + + .changelog_transfer_keys(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4442
    +4443
    +4444
    +
    +
    # File 'lib/kettle/jem.rb', line 4442
    +
    +def changelog_transfer_keys(content)
    +  content.to_s.scan(/\bkettle-jem-template-\d{8}-\d{3}\b/).to_set
    +end
    +
    +
    + +
    +

    + + .changelog_unreleased_end_index(lines, unreleased_index) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4327
    +4328
    +4329
    +4330
    +4331
    +4332
    +4333
    +4334
    +4335
    +4336
    +4337
    +4338
    +
    +
    # File 'lib/kettle/jem.rb', line 4327
    +
    +def changelog_unreleased_end_index(lines, unreleased_index)
    +  index = unreleased_index + 1
    +  while index < lines.length
    +    line = lines.fetch(index)
    +    # Markdown link-reference definitions are footer content, not Unreleased section body.
    +    return index if markdown_link_reference_definition_line?(line)
    +    return index if line.start_with?("# ") || (line.start_with?("## ") && !changelog_unreleased_heading_line?(line))
    +
    +    index += 1
    +  end
    +  lines.length
    +end
    +
    +
    + +
    +

    + + .changelog_unreleased_heading?(heading_text) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +4478
    +4479
    +4480
    +4481
    +4482
    +
    +
    # File 'lib/kettle/jem.rb', line 4478
    +
    +def changelog_unreleased_heading?(heading_text)
    +  text = heading_text.to_s.strip
    +  text = text[1...-1] if text.start_with?("[") && text.end_with?("]")
    +  text.casecmp("Unreleased").zero?
    +end
    +
    +
    + +
    +

    + + .changelog_unreleased_heading_line?(line) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +4320
    +4321
    +4322
    +4323
    +4324
    +4325
    +
    +
    # File 'lib/kettle/jem.rb', line 4320
    +
    +def changelog_unreleased_heading_line?(line)
    +  text = line.to_s.strip
    +  return false unless text.start_with?("## ")
    +
    +  changelog_unreleased_heading?(text.delete_prefix("## ").strip)
    +end
    +
    +
    + +
    +

    + + .changelog_unreleased_items(body_lines) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4344
    +4345
    +4346
    +4347
    +4348
    +4349
    +4350
    +4351
    +4352
    +4353
    +4354
    +4355
    +4356
    +4357
    +4358
    +4359
    +4360
    +4361
    +4362
    +4363
    +4364
    +4365
    +4366
    +4367
    +
    +
    # File 'lib/kettle/jem.rb', line 4344
    +
    +def changelog_unreleased_items(body_lines)
    +  items = {}
    +  heading = nil
    +  index = 0
    +  while index < body_lines.length
    +    line = body_lines.fetch(index)
    +    if line.start_with?("### ")
    +      heading = line.strip
    +      items[heading] ||= []
    +      index += 1
    +      next
    +    end
    +
    +    if changelog_bullet_line?(line)
    +      lines, index = collect_changelog_list_item(body_lines, index)
    +      items[heading] ||= []
    +      items[heading].concat(lines)
    +      next
    +    end
    +
    +    index += 1
    +  end
    +  items
    +end
    +
    +
    + +
    +

    + + .changelog_unreleased_line_index(lines) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4316
    +4317
    +4318
    +
    +
    # File 'lib/kettle/jem.rb', line 4316
    +
    +def changelog_unreleased_line_index(lines)
    +  lines.index { |line| changelog_unreleased_heading_line?(line) }
    +end
    +
    +
    + +
    +

    + + .changelog_version_heading_line?(line, version) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +5151
    +5152
    +5153
    +5154
    +5155
    +5156
    +5157
    +5158
    +
    +
    # File 'lib/kettle/jem.rb', line 5151
    +
    +def changelog_version_heading_line?(line, version)
    +  text = line.to_s.strip
    +  return false unless text.start_with?("## ")
    +
    +  heading = text.delete_prefix("## ").strip
    +  heading = heading[1...heading.index("]")] if heading.start_with?("[") && heading.include?("]")
    +  heading == version || heading.start_with?("#{version} ")
    +end
    +
    +
    + +
    +

    + + .classify_namespace(name) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +13926
    +13927
    +13928
    +
    +
    # File 'lib/kettle/jem.rb', line 13926
    +
    +def classify_namespace(name)
    +  name.to_s.split(/[-_]/).map { |part| part[0].to_s.upcase + part[1..].to_s }.join("::")
    +end
    +
    +
    + +
    +

    + + .codeberg_repo_url(repository, repo_slug, suffix) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +11914
    +11915
    +11916
    +11917
    +11918
    +11919
    +11920
    +11921
    +11922
    +
    +
    # File 'lib/kettle/jem.rb', line 11914
    +
    +def codeberg_repo_url(repository, repo_slug, suffix)
    +  resources = repository[:resource_urls] || {}
    +  return resources[:codeberg_issues_url] if suffix == "issues" && resources[:codeberg_issues_url]
    +  return resources[:codeberg_pulls_url] if suffix == "pulls" && resources[:codeberg_pulls_url]
    +
    +  base = repository[:codeberg_url].to_s
    +  base = "https://codeberg.org/#{repo_slug}" if base.empty?
    +  "#{base}/#{suffix}"
    +end
    +
    +
    + +
    +

    + + .collapse_excess_blank_lines(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +11594
    +11595
    +11596
    +11597
    +11598
    +11599
    +11600
    +11601
    +11602
    +11603
    +11604
    +11605
    +
    +
    # File 'lib/kettle/jem.rb', line 11594
    +
    +def collapse_excess_blank_lines(content)
    +  blank_count = 0
    +  content.to_s.lines.filter_map do |line|
    +    if line.strip.empty?
    +      blank_count += 1
    +      next if blank_count > 1
    +    else
    +      blank_count = 0
    +    end
    +    line
    +  end.join
    +end
    +
    +
    + +
    +

    + + .collapse_nested_templating_guards(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5726
    +5727
    +5728
    +5729
    +5730
    +5731
    +5732
    +5733
    +5734
    +5735
    +5736
    +5737
    +
    +
    # File 'lib/kettle/jem.rb', line 5726
    +
    +def collapse_nested_templating_guards(content)
    +  records = nested_templating_guard_records(content)
    +  return content if records.empty?
    +
    +  output = content.to_s
    +  records.sort_by { |record| -record.fetch(:outer_start_line) }.each do |record|
    +    inner_source = output.lines[(record.fetch(:inner_start_line) - 1)..(record.fetch(:inner_end_line) - 1)].join
    +    inner_source = outdent_source(inner_source, 2)
    +    output = replace_source_range_lines(output, record.fetch(:outer_start_line), record.fetch(:outer_end_line), inner_source)
    +  end
    +  output
    +end
    +
    +
    + +
    +

    + + .collect_changelog_list_item(lines, start_index) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4451
    +4452
    +4453
    +4454
    +4455
    +4456
    +4457
    +4458
    +4459
    +4460
    +4461
    +4462
    +4463
    +4464
    +4465
    +4466
    +4467
    +4468
    +4469
    +4470
    +4471
    +4472
    +4473
    +4474
    +4475
    +4476
    +
    +
    # File 'lib/kettle/jem.rb', line 4451
    +
    +def collect_changelog_list_item(lines, start_index)
    +  line = lines.fetch(start_index).to_s
    +  base_indent = line.length - line.lstrip.length
    +  item_lines = [line.rstrip]
    +  index = start_index + 1
    +  in_fence = false
    +  while index < lines.length
    +    current = lines.fetch(index).to_s
    +    current_indent = current.length - current.lstrip.length
    +    break if !in_fence && current.start_with?("### ")
    +    break if !in_fence && changelog_bullet_line?(current) && current_indent <= base_indent
    +
    +    if current.lstrip.start_with?("```")
    +      in_fence = !in_fence
    +      item_lines << current.rstrip
    +      index += 1
    +      next
    +    end
    +
    +    break unless in_fence || current.strip.empty? || current_indent > base_indent
    +
    +    item_lines << current.rstrip
    +    index += 1
    +  end
    +  [item_lines, index]
    +end
    +
    +
    + +
    +

    + + .collect_yaml_mapping_path_entries(node, path, entries) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14799
    +14800
    +14801
    +14802
    +14803
    +14804
    +14805
    +14806
    +14807
    +14808
    +14809
    +14810
    +14811
    +14812
    +14813
    +14814
    +14815
    +14816
    +14817
    +14818
    +14819
    +14820
    +14821
    +14822
    +14823
    +14824
    +
    +
    # File 'lib/kettle/jem.rb', line 14799
    +
    +def collect_yaml_mapping_path_entries(node, path, entries)
    +  unless node.is_a?(Psych::Nodes::Mapping)
    +    Array(node.respond_to?(:children) ? node.children : nil).each do |child|
    +      collect_yaml_mapping_path_entries(child, path, entries)
    +    end
    +    return
    +  end
    +
    +  node.children.each_slice(2) do |key_node, value_node|
    +    next unless key_node.is_a?(Psych::Nodes::Scalar)
    +
    +    child_path = path + [key_node.value.to_s]
    +    if value_node.is_a?(Psych::Nodes::Mapping)
    +      entries << {
    +        path: child_path,
    +        start_line: key_node.start_line,
    +        end_line: value_node.end_line
    +      }
    +      collect_yaml_mapping_path_entries(value_node, child_path, entries)
    +    else
    +      Array(value_node.respond_to?(:children) ? value_node.children : nil).each do |child|
    +        collect_yaml_mapping_path_entries(child, child_path, entries)
    +      end
    +    end
    +  end
    +end
    +
    +
    + +
    +

    + + .collect_yaml_scalar_path_entries(node, path, entries) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14781
    +14782
    +14783
    +14784
    +14785
    +14786
    +14787
    +14788
    +14789
    +14790
    +14791
    +14792
    +14793
    +14794
    +14795
    +14796
    +14797
    +
    +
    # File 'lib/kettle/jem.rb', line 14781
    +
    +def collect_yaml_scalar_path_entries(node, path, entries)
    +  unless node.is_a?(Psych::Nodes::Mapping)
    +    node.children.each { |child| collect_yaml_scalar_path_entries(child, path, entries) } if node.respond_to?(:children)
    +    return
    +  end
    +
    +  node.children.each_slice(2) do |key_node, value_node|
    +    next unless key_node.is_a?(Psych::Nodes::Scalar)
    +
    +    child_path = path + [key_node.value.to_s]
    +    if value_node.is_a?(Psych::Nodes::Scalar)
    +      entries << {path: child_path, line: key_node.start_line}
    +    elsif value_node.is_a?(Psych::Nodes::Mapping)
    +      collect_yaml_scalar_path_entries(value_node, child_path, entries)
    +    end
    +  end
    +end
    +
    +
    + +
    +

    + + .commented_gem_call(comment_source) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +6713
    +6714
    +6715
    +6716
    +6717
    +6718
    +6719
    +6720
    +6721
    +
    +
    # File 'lib/kettle/jem.rb', line 6713
    +
    +def commented_gem_call(comment_source)
    +  source = uncomment_ruby_comment_line(comment_source)
    +  return unless source
    +
    +  result = prism_parse_success(source)
    +  body = result&.value&.statements&.body
    +  call = body&.one? ? body.first : nil
    +  call if call.is_a?(::Prism::CallNode) && call.name == :gem
    +end
    +
    +
    + +
    +

    + + .commented_gem_dependency_block_records(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +6600
    +6601
    +6602
    +6603
    +6604
    +6605
    +6606
    +6607
    +6608
    +6609
    +6610
    +6611
    +6612
    +6613
    +
    +
    # File 'lib/kettle/jem.rb', line 6600
    +
    +def commented_gem_dependency_block_records(content)
    +  lines = content.to_s.lines
    +  commented_gem_dependency_records(content).map do |record|
    +    start_index = record.fetch(:start_line) - 1
    +    while start_index.positive? && gemfile_comment_line?(lines[start_index - 1])
    +      start_index -= 1
    +    end
    +    record.merge(
    +      block_start_line: start_index + 1,
    +      block_end_line: record.fetch(:end_line),
    +      source_lines: lines[start_index..(record.fetch(:end_line) - 1)] || []
    +    )
    +  end
    +end
    +
    +
    + +
    +

    + + .commented_gem_dependency_blocks(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +6594
    +6595
    +6596
    +6597
    +6598
    +
    +
    # File 'lib/kettle/jem.rb', line 6594
    +
    +def commented_gem_dependency_blocks(content)
    +  commented_gem_dependency_block_records(content).to_h do |record|
    +    [record.fetch(:name), record.fetch(:source_lines)]
    +  end
    +end
    +
    +
    + +
    +

    + + .commented_gem_dependency_records(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +6696
    +6697
    +6698
    +6699
    +6700
    +6701
    +6702
    +6703
    +6704
    +6705
    +6706
    +6707
    +6708
    +6709
    +6710
    +6711
    +
    +
    # File 'lib/kettle/jem.rb', line 6696
    +
    +def commented_gem_dependency_records(content)
    +  result = prism_parse_success(content)
    +  return [] unless result
    +
    +  result.comments.filter_map do |comment|
    +    call = commented_gem_call(comment.location.slice)
    +    name = ruby_string_argument(call)
    +    next unless name
    +
    +    {
    +      name: name,
    +      start_line: comment.location.start_line,
    +      end_line: comment.location.end_line
    +    }
    +  end
    +end
    +
    +
    + +
    +

    + + .compact_hash(hash) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14952
    +14953
    +14954
    +
    +
    # File 'lib/kettle/jem.rb', line 14952
    +
    +def compact_hash(hash)
    +  hash.reject { |_key, value| value.nil? || (value.respond_to?(:empty?) && value.empty?) }
    +end
    +
    +
    + +
    +

    + + .concrete_github_url(url) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +11755
    +11756
    +11757
    +
    +
    # File 'lib/kettle/jem.rb', line 11755
    +
    +def concrete_github_url(url)
    +  github_org_from_url(url) ? url.to_s : nil
    +end
    +
    +
    + +
    +

    + + .config_min_ruby(config) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +13640
    +13641
    +13642
    +13643
    +13644
    +
    +
    # File 'lib/kettle/jem.rb', line 13640
    +
    +def config_min_ruby(config)
    +  value = config.dig("rubygems", "min_ruby") || config["min_ruby"]
    +  version = value.to_s[/\d+\.\d+(?:\.\d+)?/]
    +  version && Gem::Version.new(version)
    +end
    +
    +
    + +
    +

    + + .config_test_min_ruby(config, gem_min_ruby = nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +13646
    +13647
    +13648
    +13649
    +13650
    +13651
    +13652
    +13653
    +13654
    +13655
    +13656
    +13657
    +13658
    +13659
    +13660
    +13661
    +
    +
    # File 'lib/kettle/jem.rb', line 13646
    +
    +def config_test_min_ruby(config, gem_min_ruby = nil)
    +  config ||= {}
    +  configured = config.dig("ruby", "test_minimum")
    +  configured_version = configured.to_s[/\d+\.\d+(?:\.\d+)?/]
    +  test_minimum = configured_version ? Gem::Version.new(configured_version) : DEFAULT_TEST_MINIMUM_RUBY
    +  test_minimum = [test_minimum, DEFAULT_TEST_MINIMUM_RUBY].max
    +  gem_minimum = if gem_min_ruby
    +    token = minimum_ruby_token(gem_min_ruby)
    +    Gem::Version.new(token) unless token.empty?
    +  else
    +    config_min_ruby(config)
    +  end
    +  gem_minimum ? [test_minimum, gem_minimum].max : test_minimum
    +rescue ArgumentError
    +  DEFAULT_TEST_MINIMUM_RUBY
    +end
    +
    +
    + +
    +

    + + .configured_disabled_integrations(config) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +12804
    +12805
    +12806
    +12807
    +12808
    +12809
    +12810
    +12811
    +12812
    +12813
    +12814
    +12815
    +12816
    +12817
    +12818
    +
    +
    # File 'lib/kettle/jem.rb', line 12804
    +
    +def configured_disabled_integrations(config)
    +  integrations = if config.is_a?(Hash) && config["integrations"].is_a?(Hash)
    +    config["integrations"]
    +  else
    +    {}
    +  end
    +  disabled = Array(integrations["disabled"]).map(&:to_s)
    +  integrations.each do |name, value|
    +    normalized = normalize_integration_name(name)
    +    next if normalized.empty? || normalized == "disabled"
    +
    +    disabled << normalized if falsey_config?(value)
    +  end
    +  disabled.map { |name| normalize_integration_name(name) }.uniq & MANAGED_INTEGRATIONS
    +end
    +
    +
    + +
    +

    + + .configured_readme_top_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +12084
    +12085
    +12086
    +12087
    +12088
    +12089
    +12090
    +12091
    +12092
    +12093
    +12094
    +12095
    +12096
    +
    +
    # File 'lib/kettle/jem.rb', line 12084
    +
    +def configured_readme_top_logo_entries(config, org:, gem_name:, repository: {})
    +  readme_config = (config.is_a?(Hash) && config["readme"].is_a?(Hash)) ? config["readme"] : {}
    +  logo_row = readme_config["logo_row"]
    +  return unless logo_row.is_a?(Hash)
    +  return [] if falsey_config?(logo_row["enabled"])
    +
    +  logos = Array(logo_row["logos"]).first(4)
    +  return [] if logos.empty?
    +
    +  logos.filter_map do ||
    +    readme_top_logo_entry_from_config(, org: org, gem_name: gem_name, repository: repository)
    +  end.then { |entries| deduplicate_readme_top_logo_entries(entries) }
    +end
    +
    +
    + +
    +

    + + .content_recipe_execution_report(request:, final_content:, changed:, step_reports:, diagnostics:, metadata: nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4186
    +4187
    +4188
    +4189
    +4190
    +4191
    +4192
    +4193
    +4194
    +4195
    +
    +
    # File 'lib/kettle/jem.rb', line 4186
    +
    +def content_recipe_execution_report(request:, final_content:, changed:, step_reports:, diagnostics:, metadata: nil)
    +  compact_hash(
    +    request: deep_dup(request),
    +    final_content: final_content.to_s,
    +    changed: changed ? true : false,
    +    step_reports: deep_dup(step_reports),
    +    diagnostics: deep_dup(diagnostics),
    +    metadata: deep_dup( || {})
    +  )
    +end
    +
    +
    + +
    +

    + + .content_recipe_execution_report_envelope(report) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4197
    +4198
    +4199
    +4200
    +4201
    +4202
    +4203
    +
    +
    # File 'lib/kettle/jem.rb', line 4197
    +
    +def content_recipe_execution_report_envelope(report)
    +  {
    +    kind: "content_recipe_execution_report",
    +    version: CONTENT_RECIPE_TRANSPORT_VERSION,
    +    report: deep_dup(report)
    +  }
    +end
    +
    +
    + +
    +

    + + .content_recipe_execution_request(recipe_name:, recipe_version:, relative_path:, provider_family:, template_content:, destination_content:, steps:, provider_backend: nil, runtime_context: nil, metadata: nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4162
    +4163
    +4164
    +4165
    +4166
    +4167
    +4168
    +4169
    +4170
    +4171
    +4172
    +4173
    +4174
    +4175
    +4176
    +
    +
    # File 'lib/kettle/jem.rb', line 4162
    +
    +def content_recipe_execution_request(recipe_name:, recipe_version:, relative_path:, provider_family:,
    +  template_content:, destination_content:, steps:, provider_backend: nil, runtime_context: nil, metadata: nil)
    +  compact_hash(
    +    recipe_name: recipe_name.to_s,
    +    recipe_version: recipe_version.to_s,
    +    relative_path: relative_path.to_s,
    +    provider_family: provider_family.to_s,
    +    provider_backend: provider_backend&.to_s,
    +    template_content: template_content.to_s,
    +    destination_content: destination_content.to_s,
    +    steps: deep_dup(steps),
    +    runtime_context: deep_dup(runtime_context || {}),
    +    metadata: deep_dup( || {})
    +  )
    +end
    +
    +
    + +
    +

    + + .content_recipe_execution_request_envelope(request) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4178
    +4179
    +4180
    +4181
    +4182
    +4183
    +4184
    +
    +
    # File 'lib/kettle/jem.rb', line 4178
    +
    +def content_recipe_execution_request_envelope(request)
    +  {
    +    kind: "content_recipe_execution_request",
    +    version: CONTENT_RECIPE_TRANSPORT_VERSION,
    +    request: deep_dup(request)
    +  }
    +end
    +
    +
    + +
    +

    + + .content_recipe_step(recipe) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4612
    +4613
    +4614
    +4615
    +4616
    +4617
    +4618
    +4619
    +4620
    +4621
    +4622
    +4623
    +4624
    +4625
    +4626
    +4627
    +4628
    +4629
    +4630
    +4631
    +4632
    +
    +
    # File 'lib/kettle/jem.rb', line 4612
    +
    +def content_recipe_step(recipe)
    +  step = {
    +    step_id: recipe.fetch(:name),
    +    step_kind: recipe.fetch(:primitive),
    +    name: recipe.fetch(:name),
    +    provider_family: recipe.fetch(:provider_family),
    +    metadata: {target_path: recipe.fetch(:target_path)}
    +  }
    +  step[:provider_backend] = recipe[:provider_backend] if recipe[:provider_backend]
    +  if recipe.fetch(:primitive) == "supplied_source_selector_deletion"
    +    step[:step_kind] = "native_policy"
    +    step[:policy] = {
    +      policy_kind: "delete_supplied_structural_owners",
    +      required_context: "delete_selectors",
    +      operation: "delete",
    +      selector_family: "structural_owner_range",
    +      normalize_blank_lines: true
    +    }
    +  end
    +  step
    +end
    +
    +
    + +
    +

    + + .content_recipe_step_report(recipe:, request:, original:, final:, changed:, deletion: nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4634
    +4635
    +4636
    +4637
    +4638
    +4639
    +4640
    +4641
    +4642
    +4643
    +4644
    +4645
    +4646
    +4647
    +4648
    +4649
    +4650
    +4651
    +4652
    +4653
    +4654
    +4655
    +4656
    +4657
    +4658
    +4659
    +4660
    +4661
    +4662
    +4663
    +4664
    +4665
    +
    +
    # File 'lib/kettle/jem.rb', line 4634
    +
    +def content_recipe_step_report(recipe:, request:, original:, final:, changed:, deletion: nil)
    +  operation_profile = Ast::Merge.structured_edit_operation_profile(
    +    operation_kind: recipe.fetch(:primitive),
    +    known_operation_kind: true,
    +    source_requirement: "destination_content",
    +    destination_requirement: "relative_path",
    +    replacement_source: "runtime_context",
    +    captures_source_text: false,
    +    supports_if_missing: true,
    +    operation_family: "kettle-jem"
    +  )
    +  result = Ast::Merge.structured_edit_result(
    +    operation_kind: recipe.fetch(:primitive),
    +    updated_content: final,
    +    changed: changed,
    +    operation_profile: operation_profile
    +  )
    +  application = Ast::Merge.structured_edit_application(request: request, result: result)
    +  {
    +    step_id: recipe.fetch(:name),
    +    step_kind: recipe.fetch(:primitive),
    +    status: changed ? "applied" : "unchanged",
    +    changed: changed,
    +    input_content: original,
    +    output_content: final,
    +    application: application,
    +    diagnostics: [],
    +    metadata: (recipe, deletion).merge(
    +      ruby_template_policy_report(recipe: recipe, request: request, original: original, final: final)
    +    )
    +  }
    +end
    +
    +
    + +
    +

    + + .copy_only_when_missing_template_path?(relative_path) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +13265
    +13266
    +13267
    +
    +
    # File 'lib/kettle/jem.rb', line 13265
    +
    +def copy_only_when_missing_template_path?(relative_path)
    +  COPY_ONLY_WHEN_MISSING_TEMPLATE_PATHS.include?(relative_path.to_s)
    +end
    +
    +
    + +
    + + + + + +
    +
    +
    +
    +10676
    +10677
    +10678
    +10679
    +10680
    +
    +
    # File 'lib/kettle/jem.rb', line 10676
    +
    +def copyright_author_names(copyright)
    +  Array(copyright[:lines]).filter_map do |line|
    +    copyright_name_from_line(line.to_s)
    +  end
    +end
    +
    +
    + +
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +10784
    +10785
    +10786
    +
    +
    # File 'lib/kettle/jem.rb', line 10784
    +
    +def copyright_bot_entry?(entry)
    +  entry[:name].to_s.match?(BOT_NAME_SUFFIX) || entry[:email].to_s.match?(BOT_EMAIL_PATTERN)
    +end
    +
    +
    + +
    + + + + + +
    +
    +
    +
    +10699
    +10700
    +10701
    +10702
    +
    +
    # File 'lib/kettle/jem.rb', line 10699
    +
    +def copyright_facts(project_root, config)
    +  lines = git_copyright_lines(project_root, copyright_machine_users(config))
    +  compact_hash(lines: lines)
    +end
    +
    +
    + +
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +10788
    +10789
    +10790
    +10791
    +10792
    +10793
    +
    +
    # File 'lib/kettle/jem.rb', line 10788
    +
    +def copyright_machine_user_entry?(entry, machine_users)
    +  return false if machine_users.empty?
    +
    +  machine_users.include?(entry[:name].to_s.downcase.strip) ||
    +    machine_users.include?(entry[:email].to_s.downcase.strip)
    +end
    +
    +
    + +
    + + + + + +
    +
    +
    +
    +10704
    +10705
    +10706
    +10707
    +
    +
    # File 'lib/kettle/jem.rb', line 10704
    +
    +def copyright_machine_users(config)
    +  copyright = config["copyright"].is_a?(Hash) ? config["copyright"] : {}
    +  (Array(config["machine_users"]) + Array(copyright["machine_users"])).map { |user| user.to_s.downcase.strip }.reject(&:empty?)
    +end
    +
    +
    + +
    + + + + + +
    +
    +
    +
    +10682
    +10683
    +10684
    +10685
    +10686
    +10687
    +10688
    +10689
    +
    +
    # File 'lib/kettle/jem.rb', line 10682
    +
    +def copyright_name_from_line(line)
    +  prefix = "Copyright (c) "
    +  return unless line.start_with?(prefix)
    +
    +  tokens = line[prefix.length..].to_s.split
    +  tokens.shift while tokens.first && copyright_year_token?(tokens.first)
    +  tokens.join(" ").strip.then { |name| name unless name.empty? }
    +end
    +
    +
    + +
    + + + + + +
    +
    +
    +
    +12435
    +12436
    +12437
    +12438
    +12439
    +
    +
    # File 'lib/kettle/jem.rb', line 12435
    +
    +def copyright_notice_lines(copyright_lines, copyright_prefix, author)
    +  lines = Array(copyright_lines)
    +  lines = ["Copyright (c) #{Time.now.utc.year} #{[author[:given_names], author[:family_names]].compact.join(" ").strip}"] if lines.empty?
    +  lines.map { |line| "#{copyright_prefix}#{line}" }
    +end
    +
    +
    + +
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +10691
    +10692
    +10693
    +
    +
    # File 'lib/kettle/jem.rb', line 10691
    +
    +def copyright_year_token?(token)
    +  token.delete(",-").chars.all? { |char| char.between?("0", "9") }
    +end
    +
    +
    + +
    +

    + + .coverage_thresholds_from_mise(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5003
    +5004
    +5005
    +5006
    +5007
    +5008
    +
    +
    # File 'lib/kettle/jem.rb', line 5003
    +
    +def coverage_thresholds_from_mise(content)
    +  %w[K_SOUP_COV_MIN_BRANCH K_SOUP_COV_MIN_LINE].each_with_object({}) do |key, thresholds|
    +    value = toml_string_scalar_line_value(content, key)
    +    thresholds[key] = value if value
    +  end
    +end
    +
    +
    + +
    +

    + + .coverage_thresholds_from_project_mise(project_root) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5067
    +5068
    +5069
    +5070
    +5071
    +5072
    +5073
    +5074
    +
    +
    # File 'lib/kettle/jem.rb', line 5067
    +
    +def coverage_thresholds_from_project_mise(project_root)
    +  return {} if project_root.to_s.empty?
    +
    +  path = File.join(project_root.to_s, "mise.toml")
    +  return {} unless File.file?(path)
    +
    +  coverage_thresholds_from_mise(File.read(path))
    +end
    +
    +
    + +
    +

    + + .coverage_thresholds_from_workflow(project_root) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5010
    +5011
    +5012
    +5013
    +5014
    +5015
    +5016
    +5017
    +5018
    +5019
    +5020
    +5021
    +
    +
    # File 'lib/kettle/jem.rb', line 5010
    +
    +def coverage_thresholds_from_workflow(project_root)
    +  return {} if project_root.to_s.empty?
    +
    +  path = File.join(project_root.to_s, ".github", "workflows", "coverage.yml")
    +  return {} unless File.file?(path)
    +
    +  content = File.read(path)
    +  %w[K_SOUP_COV_MIN_BRANCH K_SOUP_COV_MIN_LINE].each_with_object({}) do |key, thresholds|
    +    value = yaml_scalar_line_value(content, key)
    +    thresholds[key] = value.to_s.delete_prefix("\"").delete_suffix("\"") if value
    +  end
    +end
    +
    +
    + +
    +

    + + .coverage_thresholds_from_yaml_workflow(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5076
    +5077
    +5078
    +5079
    +5080
    +5081
    +
    +
    # File 'lib/kettle/jem.rb', line 5076
    +
    +def coverage_thresholds_from_yaml_workflow(content)
    +  %w[K_SOUP_COV_MIN_BRANCH K_SOUP_COV_MIN_LINE].each_with_object({}) do |key, thresholds|
    +    value = yaml_scalar_line_value(content, key)
    +    thresholds[key] = value if value
    +  end
    +end
    +
    +
    + +
    +

    + + .current_changelog_version_section(content, version) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5139
    +5140
    +5141
    +5142
    +5143
    +5144
    +5145
    +5146
    +5147
    +5148
    +5149
    +
    +
    # File 'lib/kettle/jem.rb', line 5139
    +
    +def current_changelog_version_section(content, version)
    +  version_text = version.to_s.strip
    +  return if version_text.empty?
    +
    +  lines = content.to_s.lines
    +  start_index = lines.index { |line| changelog_version_heading_line?(line, version_text) }
    +  return unless start_index
    +
    +  end_index = lines[(start_index + 1)..].to_a.index { |line| line.start_with?("## ") }
    +  lines[start_index...(end_index ? start_index + 1 + end_index : lines.length)].join
    +end
    +
    +
    + +
    +

    + + .decision_policy_for(env, run_options) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +9480
    +9481
    +9482
    +
    +
    # File 'lib/kettle/jem.rb', line 9480
    +
    +def decision_policy_for(env, run_options)
    +  DecisionPolicy.from_env(env || {}, **(run_options || {}))
    +end
    +
    +
    + +
    +

    + + .decorative_grapheme?(grapheme) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +9447
    +9448
    +9449
    +9450
    +9451
    +9452
    +9453
    +
    +
    # File 'lib/kettle/jem.rb', line 9447
    +
    +def decorative_grapheme?(grapheme)
    +  value = grapheme.to_s
    +  return false if value.empty?
    +  return false if value.ascii_only?
    +
    +  !value.match?(/\A[[:alnum:][:space:]]\z/u)
    +end
    +
    +
    + +
    +

    + + .deduplicate_main_gemfile_direct_sibling_blocks(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5581
    +5582
    +5583
    +5584
    +5585
    +5586
    +5587
    +5588
    +5589
    +5590
    +5591
    +5592
    +5593
    +
    +
    # File 'lib/kettle/jem.rb', line 5581
    +
    +def deduplicate_main_gemfile_direct_sibling_blocks(content)
    +  records = main_gemfile_direct_sibling_records(content)
    +  return content if records.length <= 1
    +
    +  records[0...-1].sort_by { |record| -record.fetch(:start_line) }.reduce(content.to_s) do |output, record|
    +    replace_source_range_lines(
    +      output,
    +      record.fetch(:start_line),
    +      expand_line_range_through_following_blanks(output, record.fetch(:end_line)),
    +      ""
    +    )
    +  end
    +end
    +
    +
    + +
    +

    + + .deduplicate_readme_top_logo_entries(entries) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +12098
    +12099
    +12100
    +12101
    +12102
    +
    +
    # File 'lib/kettle/jem.rb', line 12098
    +
    +def deduplicate_readme_top_logo_entries(entries)
    +  entries.group_by { |entry| entry[:image_url].to_s }.values.map do |group|
    +    group.find { |entry| entry[:type] == "related_org" } || group.first
    +  end
    +end
    +
    +
    + +
    +

    + + .deep_dup(value) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14956
    +14957
    +14958
    +
    +
    # File 'lib/kettle/jem.rb', line 14956
    +
    +def deep_dup(value)
    +  Marshal.load(Marshal.dump(value))
    +end
    +
    +
    + +
    +

    + + .deep_string_key_hash(value) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2682
    +2683
    +2684
    +2685
    +2686
    +2687
    +2688
    +2689
    +2690
    +2691
    +2692
    +2693
    +
    +
    # File 'lib/kettle/jem.rb', line 2682
    +
    +def deep_string_key_hash(value)
    +  case value
    +  when Hash
    +    value.each_with_object({}) do |(key, child), converted|
    +      converted[key.to_s] = deep_string_key_hash(child)
    +    end
    +  when Array
    +    value.map { |child| deep_string_key_hash(child) }
    +  else
    +    value
    +  end
    +end
    +
    +
    + +
    +

    + + .default_framework_matrix_requirement(version) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +13838
    +13839
    +13840
    +13841
    +13842
    +
    +
    # File 'lib/kettle/jem.rb', line 13838
    +
    +def default_framework_matrix_requirement(version)
    +  normalized = version.to_s
    +  normalized = "#{normalized}.0" if normalized.match?(/\A\d+\.\d+\z/)
    +  "~> #{normalized}"
    +end
    +
    +
    + +
    +

    + + .default_readme_top_logo_credit(type) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +12180
    +12181
    +12182
    +12183
    +12184
    +12185
    +12186
    +12187
    +
    +
    # File 'lib/kettle/jem.rb', line 12180
    +
    +def default_readme_top_logo_credit(type)
    +  case type
    +  when "ruby"
    +    "Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5"
    +  else
    +    "Aboling0, CC BY-SA 4.0"
    +  end
    +end
    +
    +
    + +
    +

    + + .default_readme_top_logo_href(type, slug:, org:, gem_name:, repository: {}) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +12165
    +12166
    +12167
    +12168
    +12169
    +12170
    +12171
    +12172
    +12173
    +12174
    +12175
    +12176
    +12177
    +12178
    +
    +
    # File 'lib/kettle/jem.rb', line 12165
    +
    +def default_readme_top_logo_href(type, slug:, org:, gem_name:, repository: {})
    +  case type
    +  when "related_org"
    +    "https://discord.gg/3qme4XHNKN"
    +  when "ruby"
    +    "https://ruby-toolbox.com"
    +  when "org"
    +    org.to_s.empty? ? "#{LOGOS_GALTZO_BASE_URL}/#{slug}/" : "https://github.com/#{org}"
    +  when "project"
    +    repository_project_logo_href(repository, slug: slug, org: org, gem_name: gem_name)
    +  else
    +    "#{LOGOS_GALTZO_BASE_URL}/#{slug}/"
    +  end
    +end
    +
    +
    + +
    +

    + + .default_readme_top_logo_slug(type, org:, gem_name:, repository: {}) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +12134
    +12135
    +12136
    +12137
    +12138
    +12139
    +12140
    +12141
    +12142
    +12143
    +12144
    +12145
    +12146
    +12147
    +
    +
    # File 'lib/kettle/jem.rb', line 12134
    +
    +def default_readme_top_logo_slug(type, org:, gem_name:, repository: {})
    +  case type
    +  when "related_org"
    +    "galtzo-floss"
    +  when "ruby"
    +    "ruby-lang"
    +  when "org"
    +    org.to_s
    +  when "project"
    +    repository_project_logo_slug(repository, org: org, gem_name: gem_name)
    +  else
    +    ""
    +  end
    +end
    +
    +
    + +
    +

    + + .default_template_configObject + + + + + +

    + + + + +
    +
    +
    +
    +13529
    +13530
    +13531
    +13532
    +13533
    +13534
    +
    +
    # File 'lib/kettle/jem.rb', line 13529
    +
    +def default_template_config
    +  {
    +    "root" => "packaged",
    +    "apply" => true
    +  }
    +end
    +
    +
    + +
    +

    + + .default_template_strategy_config(template_root, target_path) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +13269
    +13270
    +13271
    +13272
    +13273
    +13274
    +13275
    +13276
    +13277
    +13278
    +13279
    +
    +
    # File 'lib/kettle/jem.rb', line 13269
    +
    +def default_template_strategy_config(template_root, target_path)
    +  return unless template_root.fetch(:kind) == "packaged"
    +  return {strategy: :merge, preference: :destination, add_template_only_nodes: true} if target_path.to_s == KETTLE_CONFIG_PATH
    +  return {strategy: :accept_template} if target_path.to_s == "CITATION.cff"
    +  return {strategy: :merge, preference: :destination, add_template_only_nodes: true} if target_path.to_s == "Rakefile"
    +  return {strategy: :accept_template} if version_gem_template_target_path?(target_path)
    +  return {strategy: :accept_template} if target_path.to_s.start_with?(".github/workflows/")
    +  return {strategy: :accept_template} if target_path.to_s.start_with?("gemfiles/modular/")
    +
    +  nil
    +end
    +
    +
    + +
    +

    + + .delete_file_recipe?(recipe) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +9929
    +9930
    +9931
    +
    +
    # File 'lib/kettle/jem.rb', line 9929
    +
    +def delete_file_recipe?(recipe)
    +  FILE_DELETION_PRIMITIVES.include?(recipe.fetch(:primitive))
    +end
    +
    +
    + +
    +

    + + .delete_line_ranges(content, selectors) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14140
    +14141
    +14142
    +14143
    +14144
    +14145
    +14146
    +14147
    +14148
    +
    +
    # File 'lib/kettle/jem.rb', line 14140
    +
    +def delete_line_ranges(content, selectors)
    +  lines = content.lines
    +  selectors.sort_by { |selector| -selector.fetch(:start_line) }.each do |selector|
    +    start_index = selector.fetch(:start_line) - 1
    +    end_index = selector.fetch(:end_line) - 1
    +    lines.slice!(start_index..end_index)
    +  end
    +  lines.join.gsub(/\n{3,}/, "\n\n")
    +end
    +
    +
    + +
    +

    + + .delete_markdown_with_ast_crispr(content, target) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5327
    +5328
    +5329
    +5330
    +
    +
    # File 'lib/kettle/jem.rb', line 5327
    +
    +def delete_markdown_with_ast_crispr(content, target)
    +  ensure_runtime_dependencies!
    +  Ast::Crispr::Delete.call(content: content.to_s, target: target, source_label: "README.md").updated_content
    +end
    +
    +
    + +
    +

    + + .delete_project_file(project_root, relative_path) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +11433
    +11434
    +11435
    +11436
    +11437
    +11438
    +11439
    +11440
    +
    +
    # File 'lib/kettle/jem.rb', line 11433
    +
    +def delete_project_file(project_root, relative_path)
    +  path = File.join(project_root, relative_path)
    +  return unless File.file?(path)
    +
    +  File.delete(path)
    +  prune_empty_parent_directories(project_root, File.dirname(relative_path))
    +  relative_path
    +end
    +
    +
    + +
    +

    + + .delete_rakefile_scaffold(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14002
    +14003
    +14004
    +14005
    +14006
    +14007
    +14008
    +14009
    +14010
    +
    +
    # File 'lib/kettle/jem.rb', line 14002
    +
    +def delete_rakefile_scaffold(content)
    +  selectors = rakefile_scaffold_delete_selectors(content)
    +  return {content: content.to_s, delete_selectors: selectors} if selectors.empty?
    +
    +  {
    +    content: delete_line_ranges(content.to_s, selectors),
    +    delete_selectors: selectors
    +  }
    +end
    +
    +
    + +
    +

    + + .detected_license_ids(project_root) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3866
    +3867
    +3868
    +3869
    +3870
    +3871
    +
    +
    # File 'lib/kettle/jem.rb', line 3866
    +
    +def detected_license_ids(project_root)
    +  known_license_template_basenames.filter_map do |basename|
    +    path = File.join(project_root.to_s, "#{basename}.md")
    +    File.exist?(path) ? spdx_from_basename(basename) : nil
    +  end.sort
    +end
    +
    +
    + +
    +

    + + .direct_sibling_directory_defines_gem?(sibling_path, gem_name) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +11000
    +11001
    +11002
    +11003
    +11004
    +11005
    +11006
    +
    +
    # File 'lib/kettle/jem.rb', line 11000
    +
    +def direct_sibling_directory_defines_gem?(sibling_path, gem_name)
    +  return false unless File.directory?(sibling_path)
    +
    +  Dir.glob(File.join(sibling_path, "*.gemspec")).any? do |gemspec_path|
    +    ((gemspec_path), :gem_name).to_s == gem_name.to_s
    +  end
    +end
    +
    +
    + +
    +

    + + .direct_sibling_runtime_gems(project_root, gemspec_metadata, package_name:, local_modular_eval_paths: {}) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +10936
    +10937
    +10938
    +10939
    +10940
    +10941
    +10942
    +10943
    +10944
    +10945
    +10946
    +10947
    +10948
    +10949
    +10950
    +10951
    +10952
    +
    +
    # File 'lib/kettle/jem.rb', line 10936
    +
    +def direct_sibling_runtime_gems(project_root, , package_name:, local_modular_eval_paths: {})
    +  return [] unless project_root && .is_a?(Hash)
    +
    +  sibling_root = File.expand_path("..", project_root.to_s)
    +  dependencies = Array(
    +    [:runtime_dependencies] || ["runtime_dependencies"]
    +  )
    +  dependencies.each_with_object([]) do |dependency, names|
    +    name = dependency.respond_to?(:name) ? dependency.name.to_s : dependency.to_s
    +    next if name.empty? || name == package_name.to_s
    +    next unless direct_sibling_directory_defines_gem?(File.join(sibling_root, name), name)
    +    next if Array(local_modular_eval_paths[name]).any?
    +    next if names.include?(name)
    +
    +    names << name
    +  end
    +end
    +
    +
    + +
    +

    + + .direct_sibling_workspace_slug(source_url, project_root) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +11098
    +11099
    +11100
    +11101
    +11102
    +11103
    +11104
    +
    +
    # File 'lib/kettle/jem.rb', line 11098
    +
    +def direct_sibling_workspace_slug(source_url, project_root)
    +  slug = github_org_from_url(source_url).to_s
    +  return slug unless slug.empty?
    +  return "" unless project_root
    +
    +  File.basename(File.expand_path("..", project_root.to_s)).to_s
    +end
    +
    +
    + +
    +

    + + .disabled_coverage_integrations(config) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +12800
    +12801
    +12802
    +
    +
    # File 'lib/kettle/jem.rb', line 12800
    +
    +def disabled_coverage_integrations(config)
    +  configured_disabled_integrations(config) & COVERAGE_INTEGRATIONS
    +end
    +
    +
    + +
    +

    + + .disabled_integration_config_cleanups(project_root, config) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +13607
    +13608
    +13609
    +13610
    +13611
    +13612
    +13613
    +13614
    +13615
    +13616
    +
    +
    # File 'lib/kettle/jem.rb', line 13607
    +
    +def disabled_integration_config_cleanups(project_root, config)
    +  disabled_integrations(config).flat_map do |integration|
    +    INTEGRATION_TEMPLATE_PATHS.fetch(integration, []).filter_map do |relative_path|
    +      next if relative_path.start_with?(".github/workflows/")
    +      next unless File.exist?(File.join(project_root, relative_path))
    +
    +      {target_path: relative_path}
    +    end
    +  end
    +end
    +
    +
    + +
    +

    + + .disabled_integration_template_path?(target_path, config) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +13618
    +13619
    +13620
    +13621
    +13622
    +13623
    +13624
    +
    +
    # File 'lib/kettle/jem.rb', line 13618
    +
    +def disabled_integration_template_path?(target_path, config)
    +  disabled = disabled_integrations(config)
    +  return false if disabled.empty?
    +
    +  path = target_path.to_s
    +  disabled.any? { |integration| INTEGRATION_TEMPLATE_PATHS.fetch(integration, []).include?(path) }
    +end
    +
    +
    + +
    +

    + + .disabled_integrations(config, license: nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +12794
    +12795
    +12796
    +12797
    +12798
    +
    +
    # File 'lib/kettle/jem.rb', line 12794
    +
    +def disabled_integrations(config, license: nil)
    +  disabled = configured_disabled_integrations(config)
    +  disabled << SKYWALKING_EYES_INTEGRATION if skywalking_eyes_disabled_by_default?(config, license, disabled)
    +  disabled.map { |name| normalize_integration_name(name) }.uniq & MANAGED_INTEGRATIONS
    +end
    +
    +
    + +
    +

    + + .discover_facts(project_root, env: ENV, run_options: {}) ⇒ Object + + + + + +

    +
    + + + +
    +
    +
    + +

    Raises:

    +
      + +
    • + + + (ArgumentError) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +2821
    +2822
    +2823
    +2824
    +2825
    +2826
    +2827
    +2828
    +2829
    +2830
    +2831
    +2832
    +2833
    +2834
    +2835
    +2836
    +2837
    +2838
    +2839
    +2840
    +2841
    +2842
    +2843
    +2844
    +2845
    +2846
    +2847
    +2848
    +2849
    +2850
    +2851
    +2852
    +2853
    +2854
    +2855
    +2856
    +2857
    +2858
    +2859
    +2860
    +2861
    +2862
    +2863
    +2864
    +2865
    +2866
    +2867
    +2868
    +2869
    +2870
    +2871
    +2872
    +2873
    +2874
    +2875
    +2876
    +2877
    +2878
    +2879
    +2880
    +2881
    +2882
    +2883
    +2884
    +2885
    +2886
    +2887
    +2888
    +2889
    +2890
    +2891
    +2892
    +2893
    +2894
    +2895
    +2896
    +2897
    +2898
    +2899
    +2900
    +2901
    +2902
    +2903
    +2904
    +2905
    +2906
    +2907
    +2908
    +2909
    +2910
    +2911
    +2912
    +2913
    +2914
    +2915
    +2916
    +2917
    +2918
    +2919
    +2920
    +2921
    +2922
    +2923
    +2924
    +2925
    +2926
    +2927
    +2928
    +2929
    +2930
    +2931
    +2932
    +2933
    +2934
    +2935
    +2936
    +2937
    +2938
    +2939
    +2940
    +2941
    +2942
    +2943
    +2944
    +2945
    +2946
    +2947
    +2948
    +2949
    +2950
    +2951
    +2952
    +2953
    +2954
    +2955
    +2956
    +2957
    +2958
    +2959
    +2960
    +2961
    +2962
    +2963
    +2964
    +2965
    +2966
    +2967
    +2968
    +2969
    +2970
    +2971
    +2972
    +2973
    +2974
    +2975
    +2976
    +2977
    +2978
    +2979
    +2980
    +2981
    +2982
    +2983
    +2984
    +2985
    +2986
    +2987
    +2988
    +2989
    +2990
    +2991
    +2992
    +2993
    +2994
    +2995
    +2996
    +2997
    +2998
    +2999
    +3000
    +3001
    +3002
    +3003
    +3004
    +3005
    +3006
    +3007
    +3008
    +3009
    +3010
    +3011
    +3012
    +3013
    +3014
    +3015
    +3016
    +3017
    +3018
    +3019
    +3020
    +3021
    +3022
    +3023
    +3024
    +3025
    +3026
    +3027
    +3028
    +3029
    +3030
    +3031
    +3032
    +3033
    +3034
    +3035
    +3036
    +3037
    +3038
    +3039
    +3040
    +3041
    +3042
    +3043
    +3044
    +3045
    +3046
    +3047
    +3048
    +3049
    +3050
    +3051
    +3052
    +3053
    +3054
    +3055
    +3056
    +3057
    +3058
    +3059
    +3060
    +3061
    +3062
    +3063
    +3064
    +3065
    +3066
    +3067
    +3068
    +3069
    +3070
    +3071
    +3072
    +3073
    +3074
    +3075
    +3076
    +3077
    +3078
    +3079
    +3080
    +3081
    +3082
    +
    +
    # File 'lib/kettle/jem.rb', line 2821
    +
    +def discover_facts(project_root, env: ENV, run_options: {})
    +  kettle_config = kettle_jem_config(project_root)
    +  template_selection = template_selection_for(env, run_options)
    +  configured_template_profile = normalize_template_profile(kettle_config.dig("templates", "profile"))
    +  if template_selection[:template_profile].to_s.empty? && !configured_template_profile.empty?
    +    template_selection[:template_profile] = configured_template_profile
    +  end
    +  gemspec_path = Dir.glob(File.join(project_root, "*.gemspec")).min
    +  if !gemspec_path && template_selection[:template_profile].to_s == MONOREPO_ROOT_TEMPLATE_PROFILE
    +    return discover_monorepo_root_facts(project_root, kettle_config, env, template_selection)
    +  end
    +  raise ArgumentError, "no gemspec found in #{project_root}" unless gemspec_path
    +
    +  gemspec_spec = load_project_gemspec(gemspec_path)
    +   = (project_root, gemspec_path, spec: gemspec_spec)
    +  rubygems_config = kettle_config["rubygems"].is_a?(Hash) ? kettle_config["rubygems"] : {}
    +  configured_name = rubygems_config["name"].to_s.strip
    +  name = (configured_name.empty? ? nil : configured_name) ||
    +    (, :gem_name) ||
    +    File.basename(gemspec_path, ".gemspec")
    +  homepage_url = (, :homepage)
    +   = (, :source_code_uri)
    +   = nil if generated_version_tree_source_url?(, (, :version))
    +   = concrete_github_url()
    +  homepage_github_url = concrete_github_url(homepage_url)
    +  git_source_url = git_remote_source_url(project_root)
    +  git_github_url = concrete_github_url(git_source_url)
    +  source_url = if template_selection[:template_profile].to_s == SHIM_TEMPLATE_PROFILE
    +    git_github_url || git_source_url ||  || homepage_github_url ||  || homepage_url
    +  else
    +     ||
    +      git_github_url ||
    +      homepage_github_url ||
    +       ||
    +      git_source_url ||
    +      homepage_url
    +  end
    +  if homepage_github_url && git_github_url && homepage_github_url != git_github_url && source_url == git_github_url
    +    homepage_url = git_github_url
    +  end
    +  derived_github_user = (git_github_url && source_url == git_github_url) ? github_org_from_url(git_github_url) : nil
    +  entrypoint_require = rubygems_config["entrypoint_require"].to_s.strip
    +  entrypoint_require = (, :entrypoint_require) if entrypoint_require.empty?
    +  entrypoint_require = name.tr("-", "/") if entrypoint_require.to_s.empty?
    +  version_path = File.join("lib", entrypoint_require, "version.rb")
    +  entrypoint_path = File.join("lib", "#{entrypoint_require}.rb")
    +  configured_namespace = rubygems_config["namespace"].to_s.strip
    +  entrypoint_namespace = existing_entrypoint_version_namespace(project_root, entrypoint_path)
    +  version_namespace = existing_version_namespace(project_root, version_path)
    +   = (, :namespace)
    +  default_namespace = classify_namespace(name)
    +  namespace = configured_namespace.empty? ? nil : configured_namespace
    +  namespace ||= project_namespace(
    +    entrypoint_namespace: entrypoint_namespace,
    +    version_namespace: version_namespace,
    +    metadata_namespace: ,
    +    default_namespace: default_namespace
    +  )
    +  project_version = (, :version)
    +  project_version = existing_version_file_value(project_root, version_path) unless valid_gem_version?(project_version)
    +  project_version = git_version_file_value(project_root, version_path) unless valid_gem_version?(project_version)
    +  configured_min_ruby = rubygems_config["min_ruby"].to_s.strip
    +  min_ruby = (configured_min_ruby.empty? ? nil : configured_min_ruby) ||
    +    (, :required_ruby_version) ||
    +    (, :min_ruby)
    +  gemspec_licenses = Array([:licenses])
    +
    +  copyright = copyright_facts(project_root, kettle_config)
    +  author = author_facts(kettle_config, env, gemspec_metadata: , copyright: copyright)
    +  license = license_facts(
    +    kettle_config,
    +    gemspec_licenses,
    +    author: author,
    +    author_email: author[:email],
    +    copyright: copyright
    +  )
    +  gemspec_license_spdx = gemspec_licenses
    +    .map { |license_id| license_id.to_s.strip }
    +    .reject(&:empty?)
    +  project_runtime = project_runtime_facts(
    +    kettle_config,
    +    env,
    +    package_name: name,
    +    source_url: source_url,
    +    author_domain: author[:domain],
    +    min_ruby: min_ruby,
    +    test_min_ruby: config_test_min_ruby(kettle_config, min_ruby),
    +    version: project_version,
    +    project_root: project_root,
    +    gemspec_metadata: 
    +  )
    +  shim = shim_facts(
    +    kettle_config,
    +    env,
    +    run_options,
    +    package_name: name,
    +    entrypoint_require: entrypoint_require,
    +    template_profile: template_selection[:template_profile]
    +  )
    +  facts = {
    +    package: compact_hash(
    +      ecosystem: "rubygems",
    +      name: name,
    +      slug: name,
    +      summary: (, :summary),
    +      description: (, :description) ||
    +        (, :summary),
    +      homepage_url: homepage_url,
    +      source_url: source_url,
    +      license_expression: license[:expression],
    +      runtime_dependencies: gemspec_runtime_dependency_names()
    +    ),
    +    rubygems: compact_hash(
    +      gemspec_path: File.basename(gemspec_path),
    +      entrypoint_require: entrypoint_require,
    +      namespace: namespace,
    +      min_ruby: min_ruby,
    +      engines: ruby_engines_config(kettle_config)
    +    )
    +  }
    +  version_gem_facts = version_gem_facts_for_project(project_root, entrypoint_require)
    +  facts[:version_gem] = version_gem_facts unless version_gem_facts.empty?
    +  facts[:shim] = shim unless shim.empty?
    +  repository_topology = repository_topology_for(kettle_config, env, template_selection)
    +  repository = repository_facts(
    +    project_root,
    +    source_url,
    +    package_name: name,
    +    repository_topology: repository_topology
    +  )
    +  facts[:repository] = repository unless repository.empty?
    +  generated_blocks = generated_blocks_facts(, facts.merge(project_root: File.expand_path(project_root)), run_options)
    +  facts[:generated_blocks] = generated_blocks unless generated_blocks.empty?
    +  bootstrap = kettle_config_bootstrap_facts(project_root, env, template_selection: template_selection)
    +  if bootstrap
    +    min_ruby_token = minimum_ruby_token(min_ruby)
    +    bootstrap[:licenses] = gemspec_license_spdx unless gemspec_license_spdx.empty?
    +    bootstrap[:gemspec_path] = File.basename(gemspec_path) if gemspec_path
    +    bootstrap[:min_ruby] = min_ruby_token unless min_ruby_token.empty?
    +    bootstrap[:test_min_ruby] = config_test_min_ruby(kettle_config, min_ruby).to_s
    +    bootstrap[:yard_host] = project_runtime[:yard_host].to_s
    +    bootstrap[:homepage_uri] = project_runtime[:homepage_uri].to_s
    +    project_emoji = preferred_template_token_value(nil, nil, env, "KJ_PROJECT_EMOJI")
    +    project_emoji ||= readme_project_emoji(project_root)
    +    project_emoji ||= gemspec_project_emoji()
    +    project_emoji ||= "💎" if monorepo_subgem_template_profile_value?(template_selection[:template_profile])
    +    project_emoji ||= "🪞" if template_selection[:template_profile].to_s == SHIM_TEMPLATE_PROFILE
    +    bootstrap[:project_emoji] = project_emoji
    +    bootstrap[:shim] = shim if shim && !shim.empty?
    +  end
    +  facts[:kettle_config_bootstrap] = bootstrap if bootstrap
    +  facts[:author] = author unless author.empty?
    +  facts[:copyright] = copyright unless copyright.empty?
    +  forge = forge_facts(kettle_config, env, derived_github_user: derived_github_user)
    +  facts[:forge] = forge unless forge.empty?
    +  social = social_facts(kettle_config, env)
    +  facts[:social] = social unless social.empty?
    +  opencollective_policy = opencollective_policy(kettle_config, env)
    +  opencollective_disabled = opencollective_policy.fetch(:disabled)
    +  open_collective_org = opencollective_org(project_root, kettle_config, env, opencollective_disabled: opencollective_disabled)
    +  open_collective_org ||= fallback_opencollective_org unless opencollective_disabled
    +  funding = compact_hash(
    +    urls: funding_urls(
    +      project_root,
    +      name,
    +      funding_uri: (, :funding_uri),
    +      opencollective_disabled: opencollective_disabled,
    +      open_collective_org: open_collective_org && open_collective_org.fetch(:org)
    +    )
    +  )
    +  funding_tokens = funding_platform_token_facts(kettle_config, env)
    +  funding[:platform_tokens] = funding_tokens unless funding_tokens.empty?
    +  funding[:open_collective_disabled] = true if opencollective_disabled
    +  funding[:open_collective_disabled_source] = opencollective_policy[:source] if opencollective_disabled
    +  if open_collective_org
    +    funding[:open_collective_org] = open_collective_org.fetch(:org)
    +    funding[:open_collective_org_source] = open_collective_org.fetch(:source)
    +  end
    +  open_collective_files = opencollective_disabled ? opencollective_disabled_files(project_root) : []
    +  funding[:open_collective_files] = open_collective_files unless open_collective_files.empty?
    +  facts[:funding] = funding unless funding.empty?
    +  warnings = opencollective_fallback_warnings(funding, project_runtime[:github_org].to_s)
    +  facts[:warnings] = warnings unless warnings.empty?
    +  disabled_integrations = disabled_integrations(kettle_config, license: license)
    +  facts[:integrations] = {disabled: disabled_integrations} unless disabled_integrations.empty?
    +  opt_in_workflows = opt_in_workflow_cleanup_files(project_root, template_selection)
    +  facts[:template_profile] = template_selection[:template_profile] unless template_selection[:template_profile].to_s.empty?
    +  template_config = template_runtime_config(kettle_config, facts, license: license)
    +  inactive_workflows = inactive_packaged_workflow_cleanup_files(
    +    project_root,
    +    template_config,
    +    include_patterns: template_selection[:include]
    +  )
    +  inactive_templates = inactive_packaged_template_cleanup_files(project_root, template_config)
    +  facts[:ci] = {
    +    provider: "github_actions",
    +    default_branch: "main",
    +    exec_cmd: github_actions_exec_cmd(kettle_config, env),
    +    recording: project_recording_enabled?(project_root, kettle_config),
    +    ruby_versions: github_actions_ruby_versions(project_runtime.fetch(:test_min_ruby)),
    +    test_min_ruby: project_runtime.fetch(:test_min_ruby).to_s,
    +    obsolete_workflows: github_actions_obsolete_workflows(project_root),
    +    custom_workflows: github_actions_custom_workflows(project_root, template_config, opencollective_disabled: opencollective_disabled)
    +  }
    +  standard_appraisal_gemfiles = github_actions_standard_appraisal_gemfiles(kettle_config)
    +  facts[:ci][:standard_appraisal_gemfiles] = standard_appraisal_gemfiles unless standard_appraisal_gemfiles.empty?
    +  facts[:ci][:opt_in_workflow_cleanups] = opt_in_workflows unless opt_in_workflows.empty?
    +  facts[:ci][:inactive_packaged_workflow_cleanups] = inactive_workflows unless inactive_workflows.empty?
    +  coverage_config = github_actions_coverage_config(kettle_config, env)
    +  facts[:ci][:coverage] = coverage_config unless coverage_config.empty?
    +  framework_matrix = github_actions_framework_matrix(kettle_config)
    +  facts[:ci][:framework_matrix] = framework_matrix unless framework_matrix.empty?
    +  template_facts = {}
    +  template_preferences = template_source_preferences(
    +    project_root,
    +    template_config,
    +    opencollective_disabled: opencollective_disabled,
    +    include_patterns: template_selection[:include]
    +  )
    +  template_facts[:source_preferences] = template_preferences unless template_preferences.empty?
    +  template_facts[:inactive_packaged_template_cleanups] = inactive_templates unless inactive_templates.empty?
    +  shim_cleanups = shim_profile_cleanups(project_root, facts, template_preferences, template_selection: template_selection)
    +  template_facts[:shim_profile_cleanups] = shim_cleanups unless shim_cleanups.empty?
    +  legacy_cleanups = template_legacy_destination_cleanups(project_root, template_preferences)
    +  template_facts[:legacy_destination_cleanups] = legacy_cleanups unless legacy_cleanups.empty?
    +  license_cleanups = template_obsolete_license_cleanups(project_root, template_config, template_preferences)
    +  template_facts[:obsolete_license_cleanups] = license_cleanups unless license_cleanups.empty?
    +  unless template_preferences.empty?
    +    facts[:license] = license unless license.empty?
    +    facts[:project_runtime] = project_runtime unless project_runtime.empty?
    +    readme_github_org = project_runtime[:github_org].to_s
    +    readme_github_org = forge[:gh_user].to_s if readme_github_org.empty?
    +    readme_github_org = facts.fetch(:repository, {})[:slug].to_s.split("/", 2).first.to_s if readme_github_org.empty?
    +     = readme_logo_facts(
    +      kettle_config,
    +      package_name: name,
    +      github_org: readme_github_org,
    +      repository: facts[:repository]
    +    )
    +    facts[:readme_logo] =  unless .empty?
    +    readme_style = readme_style_facts(
    +      project_root,
    +      kettle_config,
    +      license,
    +      template_profile: template_selection[:template_profile],
    +      repository: facts[:repository]
    +    )
    +    facts[:readme_style] = readme_style unless readme_style.empty?
    +    facts[:ruby_style] = ruby_style_facts(project_root)
    +    changelog_transfers = changelog_transfer_entries(PACKAGED_TEMPLATE_ROOT)
    +    facts[:changelog] = {transfer_entries: changelog_transfers} unless changelog_transfers.empty?
    +    gemspec_facts = gemspec_template_facts(kettle_config)
    +    facts[:gemspec] = gemspec_facts unless gemspec_facts.empty?
    +    template_tokens = template_tokens(facts, funding)
    +    template_facts[:tokens] = template_tokens unless template_tokens.empty?
    +  end
    +  if template_facts[:tokens].to_h.empty? && funding[:open_collective_org].to_s != ""
    +    template_facts[:tokens] = {"KJ|OPENCOLLECTIVE_ORG" => funding.fetch(:open_collective_org).to_s}
    +  end
    +  facts[:templates] = template_facts unless template_facts.empty?
    +  facts
    +end
    +
    +
    + +
    +

    + + .discover_monorepo_root_facts(project_root, kettle_config, env, template_selection) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2718
    +2719
    +2720
    +2721
    +2722
    +2723
    +2724
    +2725
    +2726
    +2727
    +2728
    +2729
    +2730
    +2731
    +2732
    +2733
    +2734
    +2735
    +2736
    +2737
    +2738
    +2739
    +2740
    +2741
    +2742
    +2743
    +2744
    +2745
    +2746
    +2747
    +2748
    +2749
    +2750
    +2751
    +2752
    +2753
    +2754
    +2755
    +2756
    +2757
    +2758
    +2759
    +2760
    +2761
    +2762
    +2763
    +2764
    +2765
    +2766
    +2767
    +2768
    +2769
    +2770
    +2771
    +2772
    +2773
    +2774
    +2775
    +2776
    +2777
    +2778
    +2779
    +2780
    +2781
    +2782
    +2783
    +2784
    +2785
    +2786
    +2787
    +2788
    +2789
    +2790
    +2791
    +2792
    +2793
    +2794
    +2795
    +2796
    +2797
    +2798
    +2799
    +2800
    +2801
    +2802
    +2803
    +2804
    +2805
    +2806
    +2807
    +2808
    +2809
    +2810
    +2811
    +2812
    +2813
    +2814
    +2815
    +2816
    +2817
    +2818
    +2819
    +
    +
    # File 'lib/kettle/jem.rb', line 2718
    +
    +def discover_monorepo_root_facts(project_root, kettle_config, env, template_selection)
    +  source_url = git_remote_source_url(project_root)
    +  package_name = repository_name_from_source_url(source_url)
    +  package_name = File.basename(project_root.to_s) if package_name.empty?
    +  configured_or_detected_licenses = detected_license_ids(project_root)
    +  configured_or_detected_licenses = Array(kettle_config["licenses"]) if configured_or_detected_licenses.empty?
    +  copyright = copyright_facts(project_root, kettle_config)
    +  author = author_facts(kettle_config, env, copyright: copyright)
    +  license = license_facts(kettle_config.merge("licenses" => configured_or_detected_licenses), configured_or_detected_licenses, author: author, author_email: author[:email], copyright: copyright)
    +  test_min_ruby = config_test_min_ruby(kettle_config, nil)
    +  project_runtime = project_runtime_facts(
    +    kettle_config,
    +    env,
    +    package_name: package_name,
    +    source_url: source_url,
    +    author_domain: author[:domain],
    +    min_ruby: nil,
    +    test_min_ruby: test_min_ruby,
    +    version: nil,
    +    project_root: project_root
    +  )
    +  facts = {
    +    package: compact_hash(
    +      ecosystem: "monorepo",
    +      name: package_name,
    +      slug: package_name,
    +      description: "#{package_name} monorepo",
    +      homepage_url: source_url,
    +      source_url: source_url,
    +      license_expression: license[:expression]
    +    ),
    +    rubygems: compact_hash(
    +      namespace: classify_namespace(package_name),
    +      min_ruby: nil,
    +      engines: ruby_engines_config(kettle_config)
    +    ),
    +    template_profile: MONOREPO_ROOT_TEMPLATE_PROFILE
    +  }
    +  bootstrap = kettle_config_bootstrap_facts(project_root, env, template_selection: template_selection)
    +  bootstrap[:licenses] = configured_or_detected_licenses if bootstrap && !configured_or_detected_licenses.empty?
    +  facts[:kettle_config_bootstrap] = bootstrap if bootstrap
    +  facts[:author] = author unless author.empty?
    +  facts[:copyright] = copyright unless copyright.empty?
    +  forge = forge_facts(kettle_config, env, derived_github_user: nil)
    +  social = social_facts(kettle_config, env)
    +  facts[:forge] = forge unless forge.empty?
    +  facts[:social] = social unless social.empty?
    +  facts[:license] = license unless license.empty?
    +  facts[:project_runtime] = project_runtime unless project_runtime.empty?
    +  facts[:ruby_style] = ruby_style_facts(project_root)
    +  opencollective_policy = opencollective_policy(kettle_config, env)
    +  opencollective_disabled = opencollective_policy.fetch(:disabled)
    +  detected_open_collective_org = opencollective_org(project_root, kettle_config, env, opencollective_disabled: opencollective_disabled)
    +  detected_open_collective_org ||= fallback_opencollective_org unless opencollective_disabled
    +  funding = compact_hash(
    +    urls: funding_urls(
    +      project_root,
    +      package_name,
    +      opencollective_disabled: opencollective_disabled,
    +      open_collective_org: detected_open_collective_org && detected_open_collective_org.fetch(:org)
    +    ),
    +    platform_tokens: funding_platform_token_facts(kettle_config, env)
    +  )
    +  funding[:open_collective_disabled] = true if opencollective_disabled
    +  funding[:open_collective_disabled_source] = opencollective_policy[:source] if opencollective_disabled
    +  if detected_open_collective_org
    +    funding[:open_collective_org] = detected_open_collective_org.fetch(:org)
    +    funding[:open_collective_org_source] = detected_open_collective_org.fetch(:source)
    +  end
    +  facts[:funding] = funding unless funding.empty?
    +  repository = repository_facts(
    +    project_root,
    +    source_url,
    +    package_name: package_name,
    +    repository_topology: REPOSITORY_TOPOLOGY_STANDALONE
    +  )
    +  facts[:repository] = repository unless repository.empty?
    +  warnings = opencollective_fallback_warnings(funding, github_org_from_url(source_url).to_s)
    +  facts[:warnings] = warnings unless warnings.empty?
    +   = readme_logo_facts(
    +    kettle_config,
    +    package_name: package_name,
    +    github_org: project_runtime[:github_org],
    +    repository: facts[:repository]
    +  )
    +  facts[:readme_logo] =  unless .empty?
    +  disabled_integrations = disabled_integrations(kettle_config, license: license)
    +  facts[:integrations] = {disabled: disabled_integrations} unless disabled_integrations.empty?
    +  template_facts = {}
    +  template_config = template_runtime_config(kettle_config, facts, license: license)
    +  template_preferences = template_source_preferences(
    +    project_root,
    +    template_config,
    +    opencollective_disabled: opencollective_disabled,
    +    include_patterns: template_selection[:include]
    +  )
    +  template_facts[:source_preferences] = template_preferences unless template_preferences.empty?
    +  template_tokens = template_tokens(facts, funding)
    +  template_facts[:tokens] = template_tokens unless template_tokens.empty?
    +  facts[:templates] = template_facts unless template_facts.empty?
    +  facts
    +end
    +
    +
    + +
    +

    + + .display_path(path) ⇒ Object + + + + + +

    +
    +

    rubocop:enable ThreadSafety/ClassInstanceVariable

    + + +
    +
    +
    + + +
    + + + + +
    +
    +
    +
    +2104
    +2105
    +2106
    +2107
    +2108
    +
    +
    # File 'lib/kettle/jem.rb', line 2104
    +
    +def display_path(path)
    +  return path if path.nil?
    +
    +  path.to_s.sub(VAR_HOME_PREFIX, "/home")
    +end
    +
    +
    + +
    +

    + + .display_text(text) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +2110
    +2111
    +2112
    +2113
    +2114
    +
    +
    # File 'lib/kettle/jem.rb', line 2110
    +
    +def display_text(text)
    +  return text if text.nil?
    +
    +  text.to_s.gsub(VAR_HOME_TEXT, "/home")
    +end
    +
    +
    + +
    +

    + + .dotenv_merge_options(recipe) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +7176
    +7177
    +7178
    +7179
    +7180
    +7181
    +7182
    +7183
    +7184
    +7185
    +7186
    +7187
    +
    +
    # File 'lib/kettle/jem.rb', line 7176
    +
    +def dotenv_merge_options(recipe)
    +  options = {
    +    preference: (recipe.dig(:template_preference, :preference) || "destination").to_sym,
    +    add_template_only_nodes: true,
    +    freeze_token: recipe.dig(:template_preference, :freeze_token) || "kettle-jem"
    +  }
    +  if !recipe.dig(:template_preference, :add_template_only_nodes).nil?
    +    configured = DecisionPolicy.value_to_boolean(recipe.dig(:template_preference, :add_template_only_nodes))
    +    options[:add_template_only_nodes] = configured unless configured.nil?
    +  end
    +  options
    +end
    +
    +
    + +
    +

    + + .duplicate_drift_report(project_root:, template_root:, run_options: {}) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3960
    +3961
    +3962
    +3963
    +3964
    +3965
    +3966
    +3967
    +3968
    +3969
    +3970
    +3971
    +3972
    +3973
    +3974
    +3975
    +3976
    +3977
    +3978
    +3979
    +3980
    +3981
    +3982
    +3983
    +3984
    +3985
    +3986
    +3987
    +3988
    +3989
    +3990
    +3991
    +3992
    +3993
    +3994
    +3995
    +3996
    +3997
    +
    +
    # File 'lib/kettle/jem.rb', line 3960
    +
    +def duplicate_drift_report(project_root:, template_root:, run_options: {})
    +  runner = run_options[:duplicate_drift_runner] || run_options["duplicate_drift_runner"]
    +  unless runner
    +    begin
    +      require "kettle/drift"
    +      runner = Kettle::Drift
    +    rescue LoadError
    +      return {
    +        available: false,
    +        reason: "kettle-drift is not available"
    +      }
    +    end
    +  end
    +
    +  outcome = if runner.respond_to?(:call)
    +    runner.call(project_root: project_root, template_dir: template_root)
    +  else
    +    runner.run(
    +      project_root: project_root,
    +      template_dir: template_root,
    +      lock_path: File.join(project_root.to_s, ".kettle-drift.lock"),
    +      mode: :force_update,
    +      printer_class: nil
    +    )
    +  end
    +  {
    +    available: true,
    +    warning_count: outcome.respond_to?(:warning_count) ? outcome.warning_count : outcome.fetch(:warning_count),
    +    json_path: outcome.respond_to?(:json_path) ? outcome.json_path : outcome[:json_path],
    +    lock_path: outcome.respond_to?(:lock_path) ? outcome.lock_path : outcome[:lock_path],
    +    exit_code: outcome.respond_to?(:exit_code) ? outcome.exit_code : outcome[:exit_code]
    +  }.compact
    +rescue => error
    +  {
    +    available: false,
    +    reason: "#{error.class}: #{error.message}"
    +  }
    +end
    +
    +
    + +
    +

    + + .emit_diagnostic_events(events, diagnostics) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3587
    +3588
    +3589
    +3590
    +3591
    +3592
    +3593
    +3594
    +3595
    +3596
    +3597
    +3598
    +3599
    +3600
    +3601
    +3602
    +
    +
    # File 'lib/kettle/jem.rb', line 3587
    +
    +def emit_diagnostic_events(events, diagnostics)
    +  Array(diagnostics).each_with_index do |diagnostic, index|
    +    payload = diagnostic.respond_to?(:to_h) ? diagnostic.to_h : {message: diagnostic.to_s}
    +    emit_event(
    +      events,
    +      "diagnostic",
    +      index: index + 1,
    +      total: Array(diagnostics).length,
    +      kind: payload[:kind] || payload["kind"] || payload[:key] || payload["key"],
    +      severity: payload[:severity] || payload["severity"],
    +      path: payload[:path] || payload["path"],
    +      message: payload[:message] || payload["message"] || diagnostic.to_s,
    +      blocking: payload[:blocking] || payload["blocking"]
    +    )
    +  end
    +end
    +
    +
    + +
    +

    + + .emit_event(events, type, payload = {}) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3621
    +3622
    +3623
    +3624
    +3625
    +
    +
    # File 'lib/kettle/jem.rb', line 3621
    +
    +def emit_event(events, type, payload = {})
    +  return unless events
    +
    +  events.emit(payload.merge(type: type, event_version: 1))
    +end
    +
    +
    + +
    +

    + + .emit_phase_event(events, phase, status:, **payload) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3536
    +3537
    +3538
    +3539
    +
    +
    # File 'lib/kettle/jem.rb', line 3536
    +
    +def emit_phase_event(events, phase, status:, **payload)
    +  event_type = (status == "started") ? "phase_start" : "phase_finish"
    +  emit_event(events, event_type, payload.merge(phase: phase.to_s, status: status))
    +end
    +
    +
    + +
    +

    + + .emit_recipe_event(events, report, index:, total:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3541
    +3542
    +3543
    +3544
    +3545
    +3546
    +3547
    +3548
    +3549
    +3550
    +3551
    +3552
    +3553
    +3554
    +
    +
    # File 'lib/kettle/jem.rb', line 3541
    +
    +def emit_recipe_event(events, report, index:, total:)
    +  emit_event(
    +    events,
    +    "recipe",
    +    phase: "template",
    +    index: index + 1,
    +    total: total,
    +    path: report.fetch(:relative_path, nil),
    +    recipe: report.fetch(:recipe_name, nil),
    +    changed: report.fetch(:changed, false),
    +    status: "ok",
    +    mark: report.fetch(:changed, false) ? "*" : "."
    +  )
    +end
    +
    +
    + +
    +

    + + .emit_step_event(events, event_type, step, phase:, index: nil, total: nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3562
    +3563
    +3564
    +3565
    +3566
    +3567
    +3568
    +3569
    +3570
    +3571
    +3572
    +3573
    +3574
    +3575
    +3576
    +3577
    +3578
    +
    +
    # File 'lib/kettle/jem.rb', line 3562
    +
    +def emit_step_event(events, event_type, step, phase:, index: nil, total: nil)
    +  emit_event(
    +    events,
    +    event_type,
    +    phase: phase.to_s,
    +    index: index,
    +    total: total,
    +    name: event_payload_value(step, :name),
    +    status: event_payload_value(step, :status),
    +    reason: event_payload_value(step, :reason),
    +    command: event_payload_value(step, :command),
    +    path: event_payload_value(step, :path),
    +    changed_files: Array(event_payload_value(step, :changed_files) || []),
    +    changed_count: Array(event_payload_value(step, :changed_files) || []).length,
    +    mark: step_event_mark(step)
    +  )
    +end
    +
    +
    + +
    +

    + + .emit_step_events(events, event_type, steps, phase:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3556
    +3557
    +3558
    +3559
    +3560
    +
    +
    # File 'lib/kettle/jem.rb', line 3556
    +
    +def emit_step_events(events, event_type, steps, phase:)
    +  Array(steps).each_with_index do |step, index|
    +    emit_step_event(events, event_type, step, phase: phase, index: index + 1, total: Array(steps).length)
    +  end
    +end
    +
    +
    + +
    +

    + + .emit_summary_event(events, report) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3608
    +3609
    +3610
    +3611
    +3612
    +3613
    +3614
    +3615
    +3616
    +3617
    +3618
    +3619
    +
    +
    # File 'lib/kettle/jem.rb', line 3608
    +
    +def emit_summary_event(events, report)
    +  emit_event(
    +    events,
    +    "summary",
    +    mode: report.fetch(:mode, nil),
    +    changed_files: Array(report.fetch(:changed_files, [])),
    +    changed_count: Array(report.fetch(:changed_files, [])).length,
    +    diagnostics_count: Array(report.fetch(:diagnostics, [])).length,
    +    status: "ok",
    +    mark: "."
    +  )
    +end
    +
    +
    + +
    +

    + + .empty_gemspec_development_dependency_section_matches(lines, heading_line_indexes:, dependency_line_indexes:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +8475
    +8476
    +8477
    +8478
    +8479
    +8480
    +8481
    +8482
    +8483
    +8484
    +8485
    +8486
    +8487
    +8488
    +8489
    +8490
    +8491
    +8492
    +8493
    +8494
    +8495
    +8496
    +8497
    +8498
    +8499
    +8500
    +8501
    +8502
    +8503
    +8504
    +8505
    +8506
    +
    +
    # File 'lib/kettle/jem.rb', line 8475
    +
    +def empty_gemspec_development_dependency_section_matches(lines, heading_line_indexes:, dependency_line_indexes:)
    +  matches = []
    +  sorted_headings = heading_line_indexes.to_a.sort
    +  visited = Set.new
    +  sorted_headings.each do |heading_start|
    +    next if visited.include?(heading_start)
    +
    +    heading_end = heading_start
    +    while heading_line_indexes.include?(heading_end)
    +      visited << heading_end
    +      heading_end += 1
    +    end
    +
    +    cursor = heading_end
    +    cursor += 1 while cursor < lines.length && lines[cursor].strip != "end" && !heading_line_indexes.include?(cursor)
    +    next if (heading_end...cursor).any? { |line_index| dependency_line_indexes.include?(line_index) }
    +
    +    start_line_index = heading_start
    +    start_line_index -= 1 if lines[heading_start - 1]&.strip == ""
    +    end_line_index = heading_end - 1
    +    matches << Ast::Crispr::Match.new(
    +      start_line: start_line_index + 1,
    +      end_line: end_line_index + 1,
    +      metadata: {
    +        start_boundary: :comment_region_start,
    +        end_boundary: :owner_end_plus_trailing_gap,
    +        payload_kind: :section_branch
    +      }
    +    )
    +  end
    +  matches
    +end
    +
    +
    + +
    +

    + + .empty_gemspec_development_dependency_sections_target(receiver:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +8436
    +8437
    +8438
    +8439
    +8440
    +8441
    +8442
    +8443
    +8444
    +8445
    +8446
    +8447
    +8448
    +8449
    +8450
    +8451
    +8452
    +8453
    +8454
    +8455
    +8456
    +8457
    +8458
    +8459
    +8460
    +8461
    +8462
    +8463
    +8464
    +8465
    +8466
    +8467
    +8468
    +8469
    +8470
    +8471
    +8472
    +8473
    +
    +
    # File 'lib/kettle/jem.rb', line 8436
    +
    +def empty_gemspec_development_dependency_sections_target(receiver:)
    +  Ast::Crispr::OwnerSelector.new(
    +    id: "empty_gemspec_development_dependency_sections",
    +    limit: {at_least: 0},
    +    metadata: {
    +      adapter: Ast::Crispr::Ruby::Prism.adapter,
    +      owner_scope: :ruby_comments,
    +      selector_kind: :owner_filter,
    +      selection_intent: :section_branch,
    +      include_trailing_gap: true
    +    },
    +    locate: lambda do |context|
    +      lines = context.lines
    +      note_index = lines.find_index do |line|
    +        line.lstrip.start_with?("# NOTE: It is preferable to list development dependencies")
    +      end
    +      next [] unless note_index
    +
    +      dependency_line_indexes = gemspec_dependency_records(context.content, receiver: receiver)
    +        .map { |record| record.fetch(:start_line) - 1 }
    +        .to_set
    +      comments = context.structural_owners(owner_scope: :ruby_comments)
    +      heading_line_indexes = comments.filter_map do |comment|
    +        line_index = comment.location.start_line - 1
    +        next if line_index <= note_index
    +        next unless gemspec_dependency_section_heading_comment?(lines.fetch(line_index).lstrip)
    +
    +        line_index
    +      end.to_set
    +
    +      empty_gemspec_development_dependency_section_matches(
    +        lines,
    +        heading_line_indexes: heading_line_indexes,
    +        dependency_line_indexes: dependency_line_indexes
    +      )
    +    end
    +  )
    +end
    +
    +
    + +
    +

    + + .enabled_ruby_engines(config) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +13635
    +13636
    +13637
    +13638
    +
    +
    # File 'lib/kettle/jem.rb', line 13635
    +
    +def enabled_ruby_engines(config)
    +  engines = ruby_engines_config(config)
    +  (engines.nil? || engines.empty?) ? DEFAULT_ENGINES : engines
    +end
    +
    +
    + +
    +

    + + .enforce_gemspec_dependency_minimum_requirements(source, receiver:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +8293
    +8294
    +8295
    +8296
    +8297
    +8298
    +8299
    +8300
    +8301
    +8302
    +8303
    +8304
    +8305
    +8306
    +8307
    +8308
    +
    +
    # File 'lib/kettle/jem.rb', line 8293
    +
    +def enforce_gemspec_dependency_minimum_requirements(source, receiver:)
    +  replacements = ruby_call_records(source, nil).filter_map do |call|
    +    next unless gemspec_dependency_call_kind(call)
    +    next if receiver && call.receiver&.slice != receiver.to_s
    +
    +    name = ruby_string_argument(call)
    +    requirement = GEMSPEC_DEPENDENCY_MINIMUM_REQUIREMENTS[name]
    +    next unless requirement
    +    next if gemspec_dependency_requirements_satisfy_floor?(ruby_string_arguments(call).drop(1), requirement)
    +
    +    gemspec_dependency_minimum_requirement_replacement(call, requirement)
    +  end
    +  return source if replacements.empty?
    +
    +  replace_source_offsets(source, replacements)
    +end
    +
    +
    + +
    +

    + + .enforce_git_preflight!(git_preflight, decision_policy:, template_selection:) ⇒ Object + + + + + +

    +
    + + + +
    +
    +
    + +

    Raises:

    +
      + +
    • + + + (Error) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +9900
    +9901
    +9902
    +9903
    +9904
    +9905
    +
    +
    # File 'lib/kettle/jem.rb', line 9900
    +
    +def enforce_git_preflight!(git_preflight, decision_policy:, template_selection:)
    +  return unless decision_policy.require_clean
    +  return if template_selection.fetch(:skip_commit, false)
    +  raise Error, "Git preflight failed: project is not a git repository" unless git_preflight.fetch(:git_repository)
    +  raise Error, "Git preflight failed: worktree is not clean" unless git_preflight.fetch(:clean_worktree)
    +end
    +
    +
    + +
    +

    + + .ensure_gemspec_legacy_version_loader_preamble(content, entrypoint_require:, namespace:, min_ruby:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +7496
    +7497
    +7498
    +7499
    +7500
    +7501
    +7502
    +7503
    +7504
    +7505
    +
    +
    # File 'lib/kettle/jem.rb', line 7496
    +
    +def ensure_gemspec_legacy_version_loader_preamble(content, entrypoint_require:, namespace:, min_ruby:)
    +  block = "#{gemspec_legacy_version_loader_block(entrypoint_require: entrypoint_require, namespace: namespace, min_ruby: min_ruby)}\n"
    +  node = gemspec_top_level_gem_version_node(content)
    +  return replace_source_range_lines(content, node.location.start_line, expand_line_range_through_following_blanks(content, node.location.end_line), block) if node
    +
    +  gemspec_call = gemspec_new_call(content)
    +  return content unless gemspec_call
    +
    +  insert_lines_before(content, gemspec_call.location.start_line, block)
    +end
    +
    +
    + +
    +

    + + .ensure_main_gemfile_nomono_bootstrap(content, template_content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5638
    +5639
    +5640
    +5641
    +5642
    +5643
    +5644
    +5645
    +5646
    +5647
    +5648
    +5649
    +5650
    +5651
    +
    +
    # File 'lib/kettle/jem.rb', line 5638
    +
    +def ensure_main_gemfile_nomono_bootstrap(content, template_content)
    +  return content if gemfile_declares_gem?(content, "nomono")
    +
    +  bootstrap_source = main_gemfile_nomono_bootstrap_source(template_content)
    +  return content if bootstrap_source.empty?
    +
    +  lines = content.to_s.lines
    +  insert_line = main_gemfile_templating_eval_line(content) ||
    +    main_gemfile_first_eval_gemfile_line(content) ||
    +    main_gemfile_after_gemspec_line(content) ||
    +    (lines.length + 1)
    +  lines.insert(insert_line - 1, bootstrap_source)
    +  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
    +end
    +
    +
    + +
    +

    + + .ensure_monorepo_root_gemfile_dependencies(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3820
    +3821
    +3822
    +3823
    +3824
    +3825
    +3826
    +3827
    +3828
    +3829
    +
    +
    # File 'lib/kettle/jem.rb', line 3820
    +
    +def ensure_monorepo_root_gemfile_dependencies(content)
    +  updated = ensure_trailing_newline(content.to_s.empty? ? %(source "https://gem.coop"\n) : content.to_s).dup
    +  monorepo_root_gemfile_dependency_lines.each do |line|
    +    next if gemfile_declares_gem?(updated, line.fetch(:name))
    +
    +    updated << "\n" unless updated.end_with?("\n\n")
    +    updated << line.fetch(:source)
    +  end
    +  ensure_trailing_newline(updated)
    +end
    +
    +
    + +
    +

    + + .ensure_runtime_dependencies!Object + + + + + +

    +
    +

    rubocop:disable ThreadSafety/ClassInstanceVariable

    + + +
    +
    +
    + + +
    + + + + +
    +
    +
    +
    +2086
    +2087
    +2088
    +2089
    +2090
    +2091
    +2092
    +2093
    +2094
    +2095
    +2096
    +2097
    +2098
    +2099
    +2100
    +2101
    +
    +
    # File 'lib/kettle/jem.rb', line 2086
    +
    +def ensure_runtime_dependencies!
    +  return if defined?(@runtime_dependencies_loaded) && @runtime_dependencies_loaded
    +
    +  require "ruby/merge"
    +  require "prism/merge"
    +  require "bash/merge"
    +  require "json/merge"
    +  require "dotenv/merge"
    +  require "rbs"
    +  require "rbs/merge"
    +  require "citrus-toml-merge"
    +  require "psych-merge"
    +  require "ast/crispr/markdown/markly"
    +  require "ast/crispr/ruby/prism"
    +  @runtime_dependencies_loaded = true
    +end
    +
    +
    + +
    +

    + + .ensure_spec_helper_simplecov_config_require(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5957
    +5958
    +5959
    +5960
    +5961
    +5962
    +5963
    +5964
    +5965
    +5966
    +5967
    +5968
    +
    +
    # File 'lib/kettle/jem.rb', line 5957
    +
    +def ensure_spec_helper_simplecov_config_require(content)
    +  return content if simplecov_config_require_call_nodes(content).any?
    +
    +  simplecov_require = simplecov_require_call_records(content).first
    +  return content unless simplecov_require
    +
    +  insert_lines_after(
    +    content,
    +    simplecov_require.fetch(:end_line),
    +    "#{leading_whitespace(simplecov_require.fetch(:source))}require \"kettle/soup/cover/config\"\n"
    +  )
    +end
    +
    +
    + +
    +

    + + .ensure_spec_helper_simplecov_do_cov_bootstrap(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5862
    +5863
    +5864
    +5865
    +5866
    +5867
    +5868
    +5869
    +5870
    +5871
    +5872
    +5873
    +
    +
    # File 'lib/kettle/jem.rb', line 5862
    +
    +def ensure_spec_helper_simplecov_do_cov_bootstrap(content)
    +  record = simplecov_do_cov_bootstrap_records(content).first
    +  return content unless record
    +  return content if record.fetch(:complete)
    +
    +  replace_source_range_lines(
    +    content,
    +    record.fetch(:start_line),
    +    record.fetch(:end_line),
    +    spec_helper_simplecov_do_cov_bootstrap_source(leading_whitespace(record.fetch(:source)))
    +  )
    +end
    +
    +
    + +
    +

    + + .ensure_spec_helper_simplecov_start(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5970
    +5971
    +5972
    +5973
    +5974
    +5975
    +5976
    +5977
    +5978
    +5979
    +5980
    +5981
    +
    +
    # File 'lib/kettle/jem.rb', line 5970
    +
    +def ensure_spec_helper_simplecov_start(content)
    +  return content if simplecov_start_call_nodes(content).any?
    +
    +  config_require = simplecov_config_require_call_records(content).first
    +  return content unless config_require
    +
    +  insert_lines_after(
    +    content,
    +    config_require.fetch(:end_line),
    +    "#{leading_whitespace(config_require.fetch(:source))}SimpleCov.start\n"
    +  )
    +end
    +
    +
    + +
    +

    + + .ensure_trailing_newline(text) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14946
    +14947
    +14948
    +14949
    +14950
    +
    +
    # File 'lib/kettle/jem.rb', line 14946
    +
    +def ensure_trailing_newline(text)
    +  return "" if text.to_s.empty?
    +
    +  text.end_with?("\n") ? text : "#{text}\n"
    +end
    +
    +
    + +
    +

    + + .ensure_workflow_top_level_section(content, key, section, before:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14599
    +14600
    +14601
    +14602
    +14603
    +14604
    +14605
    +14606
    +14607
    +14608
    +14609
    +14610
    +14611
    +14612
    +14613
    +
    +
    # File 'lib/kettle/jem.rb', line 14599
    +
    +def ensure_workflow_top_level_section(content, key, section, before:)
    +  top_level_keys = yaml_top_level_key_lines(content)
    +  return content if top_level_keys.key?(key.to_s)
    +
    +  lines = content.lines
    +  index = top_level_keys[before.to_s]
    +  if index
    +    prepared_section = (index.zero? || lines[index - 1].strip.empty?) ? section : "\n#{section}"
    +    lines.insert(index, prepared_section)
    +  else
    +    lines << "\n" unless lines.empty? || lines.last == "\n"
    +    lines << section
    +  end
    +  lines.join
    +end
    +
    +
    + +
    +

    + + .ensure_yaml_top_level_sequence_items(content, key, items) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +9014
    +9015
    +9016
    +9017
    +9018
    +9019
    +9020
    +9021
    +9022
    +9023
    +9024
    +9025
    +9026
    +9027
    +9028
    +9029
    +9030
    +9031
    +9032
    +9033
    +9034
    +9035
    +9036
    +9037
    +9038
    +9039
    +9040
    +9041
    +9042
    +9043
    +9044
    +9045
    +
    +
    # File 'lib/kettle/jem.rb', line 9014
    +
    +def ensure_yaml_top_level_sequence_items(content, key, items)
    +  document = Psych.parse_stream(content.to_s).children.first
    +  root = document&.root
    +  return content unless root.is_a?(Psych::Nodes::Mapping)
    +
    +  key_node, value_node = root.children.each_slice(2).find do |candidate_key, _candidate_value|
    +    candidate_key.is_a?(Psych::Nodes::Scalar) && candidate_key.value.to_s == key.to_s
    +  end
    +  lines = content.to_s.lines
    +  unless key_node
    +    lines << "\n" unless lines.empty? || lines.last.strip.empty?
    +    lines << "#{key}:\n"
    +    items.each { |item| lines << "  - #{item}\n" }
    +    return lines.join
    +  end
    +  return content unless value_node.is_a?(Psych::Nodes::Sequence)
    +
    +  existing = value_node.children.filter_map do |child|
    +    child.value.to_s if child.is_a?(Psych::Nodes::Scalar)
    +  end
    +  missing = items.map(&:to_s) - existing
    +  return content if missing.empty?
    +
    +  reference_line = value_node.children.last&.start_line || key_node.start_line
    +  reference = lines[reference_line].to_s
    +  indent = reference.start_with?("-") ? "" : reference[/\A\s*/].to_s
    +  insertion_index = value_node.children.last ? value_node.children.last.end_line + 1 : key_node.end_line + 1
    +  lines.insert(insertion_index, *missing.map { |item| "#{indent}- #{item}\n" })
    +  lines.join
    +rescue Psych::Exception
    +  content
    +end
    +
    +
    + +
    +

    + + .env_overridden_gemspec_fields(env) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +8162
    +8163
    +8164
    +8165
    +8166
    +8167
    +
    +
    # File 'lib/kettle/jem.rb', line 8162
    +
    +def env_overridden_gemspec_fields(env)
    +  fields = []
    +  fields << "authors" if present_template_token_value?(env["KJ_AUTHOR_NAME"].to_s)
    +  fields << "email" if present_template_token_value?(env["KJ_AUTHOR_EMAIL"].to_s)
    +  fields
    +end
    +
    +
    + +
    +

    + + .env_sync_value(env, env_key) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +8850
    +8851
    +8852
    +8853
    +8854
    +8855
    +8856
    +
    +
    # File 'lib/kettle/jem.rb', line 8850
    +
    +def env_sync_value(env, env_key)
    +  Array(env_key).each do |candidate|
    +    value = env[candidate].to_s.strip
    +    return value if present_template_token_value?(value)
    +  end
    +  ""
    +end
    +
    +
    + +
    +

    + + .event_payload_value(payload, key) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3604
    +3605
    +3606
    +
    +
    # File 'lib/kettle/jem.rb', line 3604
    +
    +def event_payload_value(payload, key)
    +  payload.fetch(key, payload.fetch(key.to_s, nil))
    +end
    +
    +
    + +
    +

    + + .event_stream(io, types: nil) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3497
    +3498
    +3499
    +
    +
    # File 'lib/kettle/jem.rb', line 3497
    +
    +def event_stream(io, types: nil)
    +  EventStream.new(io, types: parse_event_types(types))
    +end
    +
    +
    + +
    +

    + + .event_stream_from_options(run_options) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3514
    +3515
    +3516
    +3517
    +
    +
    # File 'lib/kettle/jem.rb', line 3514
    +
    +def event_stream_from_options(run_options)
    +  stream = (run_options || {})[:event_stream] || (run_options || {})["event_stream"]
    +  stream if stream.respond_to?(:emit)
    +end
    +
    +
    + +
    +

    + + .execute_recipe(project_root:, recipe:, facts:, files:, decision_policy:, env: ENV) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +4495
    +4496
    +4497
    +4498
    +4499
    +4500
    +4501
    +4502
    +4503
    +4504
    +4505
    +4506
    +4507
    +4508
    +4509
    +4510
    +4511
    +4512
    +4513
    +4514
    +4515
    +4516
    +4517
    +4518
    +4519
    +4520
    +4521
    +4522
    +4523
    +4524
    +4525
    +4526
    +4527
    +4528
    +4529
    +4530
    +4531
    +4532
    +4533
    +4534
    +4535
    +4536
    +4537
    +4538
    +4539
    +4540
    +4541
    +4542
    +4543
    +4544
    +4545
    +4546
    +4547
    +4548
    +4549
    +4550
    +4551
    +4552
    +4553
    +4554
    +4555
    +4556
    +4557
    +4558
    +4559
    +4560
    +4561
    +4562
    +4563
    +4564
    +4565
    +4566
    +4567
    +4568
    +4569
    +4570
    +4571
    +4572
    +4573
    +4574
    +4575
    +4576
    +4577
    +4578
    +4579
    +4580
    +4581
    +4582
    +4583
    +4584
    +4585
    +4586
    +4587
    +4588
    +4589
    +4590
    +4591
    +4592
    +4593
    +4594
    +4595
    +4596
    +4597
    +4598
    +4599
    +4600
    +
    +
    # File 'lib/kettle/jem.rb', line 4495
    +
    +def execute_recipe(project_root:, recipe:, facts:, files:, decision_policy:, env: ENV)
    +  relative_path = recipe.fetch(:target_path)
    +  destination_existed = File.exist?(File.join(project_root, relative_path))
    +  original = files.fetch(relative_path, "")
    +  deletion = rakefile_scaffold_cleanup_recipe?(recipe) ? rakefile_scaffold_cleanup(original, facts) : nil
    +  final = case recipe.fetch(:name)
    +  when "readme_metadata"
    +    synchronize_readme(original, facts, project_root: project_root)
    +  when "changelog_unreleased"
    +    apply_changelog_transfer_entries(
    +      normalize_changelog(original, facts),
    +      facts.to_h.dig(:changelog, :transfer_entries)
    +    )
    +  when "generated_block_sync"
    +    synchronize_managed_block(original, facts)
    +  when "github_funding_yml"
    +    synchronize_github_funding_yml(original, facts)
    +  when "github_actions_ci"
    +    synchronize_github_actions_ci(original, facts)
    +  when "github_actions_framework_ci"
    +    synchronize_github_actions_framework_ci(original, facts)
    +  when /\Agithub_actions_framework_gemfile_/
    +    synchronize_github_actions_framework_gemfile(recipe.fetch(:target_path), facts)
    +  when "github_actions_coverage_ci"
    +    synchronize_github_actions_coverage_ci(original, facts)
    +  when /\Agithub_actions_obsolete_workflow_cleanup_/
    +    ""
    +  when /\Agithub_actions_opt_in_workflow_cleanup_/
    +    ""
    +  when /\Aopencollective_disabled_file_cleanup_/
    +    ""
    +  when /\Atemplate_legacy_destination_cleanup_/
    +    ""
    +  when /\Atemplate_obsolete_license_cleanup_/
    +    ""
    +  when /\Atemplate_shim_profile_cleanup_/
    +    ""
    +  when /\Agithub_actions_workflow_snippets_/
    +    synchronize_github_actions_workflow_snippets(original, facts: facts)
    +  when "kettle_config_bootstrap"
    +    apply_kettle_config_bootstrap(project_root, recipe, env: env)
    +  when /\Atemplate_source_preference_/
    +    original
    +  when /\Atemplate_source_application_/
    +    apply_template_source(project_root, recipe, original, facts: facts, env: env)
    +  when "rakefile_scaffold_cleanup"
    +    deletion.fetch(:content)
    +  else
    +    original
    +  end
    +  final = normalize_generated_rakefile(final) if relative_path == "Rakefile"
    +  final = ensure_trailing_newline(final) unless delete_file_recipe?(recipe)
     
    -4588
    -4589
    -4590
    -4591
    -4592
    -4593
    -4594
    -4595
    -4596
    -4597
    -4598
    -4599
    + template_content = recipe_template_content(project_root, recipe) + request = content_recipe_execution_request( + recipe_name: recipe.fetch(:primitive), + recipe_version: "1", + relative_path: relative_path, + provider_family: recipe.fetch(:provider_family), + provider_backend: recipe[:provider_backend], + template_content: template_content, + destination_content: original, + steps: [content_recipe_step(recipe)], + runtime_context: recipe_runtime_context(recipe, facts, deletion), + metadata: {packaging_recipe: recipe.fetch(:name), project_root: project_root.to_s} + ) + changed = delete_file_recipe?(recipe) || final != original + = (recipe).merge(destination_existed: destination_existed) + decision_evaluation = recipe_decision_evaluation( + decision_policy: decision_policy, + recipe: recipe, + changed: changed, + destination_existed: destination_existed + ) + if %w[keep skip].include?(decision_evaluation.fetch(:selected_action)) + final = original + changed = false + deletion = nil + end + if github_workflow_template_recipe?(recipe) + stale_pins = stale_github_workflow_template_pin_records(relative_path, final, original) + [:stale_github_workflow_template_pins] = stale_pins unless stale_pins.empty? + end + step_report = content_recipe_step_report(recipe: recipe, request: request, original: original, final: final, changed: changed, deletion: deletion) + [:decision_evaluation] = decision_evaluation + report = content_recipe_execution_report( + request: request, + final_content: final, + changed: changed, + step_reports: [step_report], + diagnostics: [], + metadata: + ) + + { + recipe_name: recipe.fetch(:name), + relative_path: relative_path, + changed: changed, + request_envelope: content_recipe_execution_request_envelope(request), + report_envelope: content_recipe_execution_report_envelope(report), + final_content: final, + metadata: , + decision_evaluation: decision_evaluation, + diagnostics: [] + } +end
    +
    + +
    +

    + + .existing_entrypoint_version_namespace(project_root, relative_path) ⇒ Object + + + + + +

    + + @@ -18107,9 +33776,9 @@

    - .append_used_markdown_link_definitions(content, definition_source) ⇒ Object + .existing_version_file_value(project_root, relative_path) ⇒ Object @@ -18121,35 +33790,85 @@

    + +
    -
    # File 'lib/kettle/jem.rb', line 4588
    +      
     
    -def append_missing_markdown_link_definitions(content, definitions)
    -  existing = Ast::Crispr::Markdown::Markly.document_context(
    -    content: content,
    -    source_label: "README.md"
    -  ).structural_owners(owner_scope: :link_definitions).map { |owner| owner.label.to_s }
    -  missing_sources = definitions.reject { |owner| existing.include?(owner.label.to_s) }.map do |owner|
    -    owner.source.to_s.end_with?("\n") ? owner.source.to_s : "#{owner.source}\n"
    -  end
    -  return content if missing_sources.empty?
     
    -  [content.to_s.rstrip, "", missing_sources.join.rstrip, ""].join("\n")
    +11692
    +11693
    +11694
    +11695
    +
    +
    # File 'lib/kettle/jem.rb', line 11692
    +
    +def existing_entrypoint_version_namespace(project_root, relative_path)
    +  content = read_project_file(project_root, relative_path)
    +  ruby_version_class_eval_namespaces(content).first || ruby_entrypoint_module_namespace(content)
     end
    -
    # File 'lib/kettle/jem.rb', line 4601
    +      
    # File 'lib/kettle/jem.rb', line 11632
     
    -def append_used_markdown_link_definitions(content, definition_source)
    -  existing = ReadmePostProcessor.markdown_link_definition_owners(content).map { |owner| owner.label.to_s }.to_set
    -  referenced = ReadmePostProcessor.markdown_inline_reference_owners(content).flat_map(&:labels).map(&:to_s).to_set
    -  available = ReadmePostProcessor.markdown_link_definition_owners(definition_source).to_h do |owner|
    -    [owner.label.to_s, owner]
    -  end
    -  missing = referenced.filter_map do |label|
    -    next if existing.include?(label)
    +def existing_version_file_value(project_root, relative_path)
    +  ruby_version_constant_value(read_project_file(project_root, relative_path)).to_s
    +end
    +
    +
    + +
    +

    + + .existing_version_namespace(project_root, relative_path) ⇒ Object + - available[label] + + + +

    + + + + +
    +
    +
    +
    +11648
    +11649
    +11650
    +
    +
    # File 'lib/kettle/jem.rb', line 11648
    +
    +def existing_version_namespace(project_root, relative_path)
    +  ruby_version_module_namespace(read_project_file(project_root, relative_path))
    +end
    +
    +
    + +
    +

    + + .expand_framework_gemfile_pattern(pattern, version) ⇒ Object + + + + + +

    + + + @@ -18157,9 +33876,9 @@ + +
    +
    +
    +
    +13913
    +13914
    +13915
    +13916
    +13917
    +13918
    +13919
    +13920
    +
    +
    # File 'lib/kettle/jem.rb', line 13913
    +
    +def expand_framework_gemfile_pattern(pattern, version)
    +  replacement = if pattern.include?("_{version}") || pattern.include?("{version}_")
    +    version.tr(".", "_")
    +  else
    +    version
       end
    -  append_missing_markdown_link_definitions(content, missing)
    +  pattern.gsub("{version}", replacement)
     end
    -
    # File 'lib/kettle/jem.rb', line 5228
    +      
    # File 'lib/kettle/jem.rb', line 7520
     
    -def apply_commented_gem_dependency_policy(template_content, content)
    -  commented_blocks = commented_gem_dependency_blocks(template_content)
    -  return content if commented_blocks.empty?
    +def expand_line_range_through_following_blanks(content, end_line)
    +  lines = content.to_s.lines
    +  line = end_line
    +  line += 1 while lines[line]&.strip == ""
    +  line
    +end
    +
    +
    + +
    +

    + + .explicit_integration_enabled?(config, integration) ⇒ Boolean + - = gemfile_gem_call_records(content) - .select { |record| commented_blocks.key?(record.fetch(:name)) } - .to_h { |record| [record.fetch(:start_line), record] } - = commented_gem_dependency_block_records(content) - .select { |record| commented_blocks.key?(record.fetch(:name)) } - .to_h { |record| [record.fetch(:block_start_line), record] } - inserted = Set.new - skip_until = 0 - lines = [] - content.to_s.lines.each_with_index do |line, index| - line_number = index + 1 - next if line_number < skip_until + - if (record = [line_number]) - gem_name = record.fetch(:name) - append_gemfile_comment_block(lines, commented_blocks.fetch(gem_name)) unless inserted.include?(gem_name) - inserted << gem_name - skip_until = record.fetch(:block_end_line) + 1 - next - end + +

    +
    + - if (record = [line_number]) - gem_name = record.fetch(:name) - append_gemfile_comment_block(lines, commented_blocks.fetch(gem_name)) unless inserted.include?(gem_name) - inserted << gem_name - skip_until = record.fetch(:end_line) + 1 - next - end - lines << line +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + @@ -18255,9 +33973,62 @@

    -

    +

    - .apply_configured_gemspec_licenses(content, facts, receiver:) ⇒ Object + .explicit_zero_runtime_floor?(facts) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +

    +
    +
    +
    +12842
    +12843
    +12844
    +12845
    +12846
    +12847
    +12848
    +
    +
    # File 'lib/kettle/jem.rb', line 12842
    +
    +def explicit_integration_enabled?(config, integration)
    +  return false unless config.is_a?(Hash) && config["integrations"].is_a?(Hash)
    +
    +  config["integrations"].any? do |name, value|
    +    normalize_integration_name(name) == integration && truthy_config?(value)
       end
    -  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
     end
    + + + + +
    +
    +
    +
    +7635
    +7636
    +7637
    +
    +
    # File 'lib/kettle/jem.rb', line 7635
    +
    +def explicit_zero_runtime_floor?(facts)
    +  facts.to_h.dig(:rubygems, :min_ruby).to_s.strip == "0"
    +end
    +
    +
    + +
    +

    + + .extract_gemspec_development_dependencies(gemspec) ⇒ Object @@ -18269,35 +34040,166 @@

     
     
    -6084
    -6085
    -6086
    -6087
    -6088
    -6089
    -6090
    -6091
    -6092
    -6093
    -6094
    -6095
    -6096
    +3348 +3349 +3350 +3351 +3352 +3353 +3354 +3355 +3356 +3357 +3358 +3359 +3360 +3361 +3362 +3363 +3364

    -
    # File 'lib/kettle/jem.rb', line 6084
    +      
    # File 'lib/kettle/jem.rb', line 3348
     
    -def apply_configured_gemspec_licenses(content, facts, receiver:)
    -  licenses = Array(facts&.dig(:license, :spdx)).map { |license| license.to_s.strip }.reject(&:empty?)
    -  return content if licenses.empty?
    +def extract_gemspec_development_dependencies(gemspec)
    +  if gemspec.is_a?(Hash)
    +    return Array(gemspec[:development_dependencies] || gemspec["development_dependencies"]).map do |dependency|
    +      {
    +        name: dependency.name.to_s,
    +        requirement: dependency.requirement.to_s
    +      }
    +    end.reject { |dependency| dependency.fetch(:name).empty? }.uniq { |dependency| dependency.fetch(:name) }
    +  end
     
    -  replacement = "#{receiver}.licenses = #{licenses.inspect}"
    -  existing = gemspec_assignment_records(content, receiver: receiver).find { |record| record.fetch(:field) == "licenses" }
    -  return replace_source_range_lines(content, existing.fetch(:start_line), existing.fetch(:end_line), "#{leading_whitespace(existing.fetch(:source))}#{replacement}\n") if existing
    +  Array(gemspec&.development_dependencies).map do |dependency|
    +    {
    +      name: dependency.name.to_s,
    +      requirement: dependency.requirement.to_s
    +    }
    +  end.reject { |dependency| dependency.fetch(:name).empty? }.uniq { |dependency| dependency.fetch(:name) }
    +end
    +
    +
    + +
    +

    + + .fallback_opencollective_orgObject + - homepage = gemspec_assignment_records(content, receiver: receiver).find { |record| record.fetch(:field) == "homepage" } - return insert_lines_after(content, homepage.fetch(:end_line), " #{replacement}\n") if homepage + + + +

    + + + + +
    +
    +
    +
    +10243
    +10244
    +10245
    +
    +
    # File 'lib/kettle/jem.rb', line 10243
    +
    +def fallback_opencollective_org
    +  {org: DEFAULT_OPENCOLLECTIVE_ORG, source: "fallback.default"}
    +end
    +
    +
    + +
    +

    + + .falsey_config?(value) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +12904
    +12905
    +12906
    +
    +
    # File 'lib/kettle/jem.rb', line 12904
    +
    +def falsey_config?(value)
    +  %w[false no 0].include?(value.to_s.strip.downcase)
    +end
    +
    +
    + +
    +

    + + .filter_recipe_pack(pack, template_selection) ⇒ Object + + + + + +

    + + + @@ -18305,9 +34207,9 @@

    -

    +

    - .apply_configured_gemspec_required_ruby_version(content, facts, receiver:) ⇒ Object + .finalize_accepted_template_source(recipe, content, destination_content, facts:, project_root: nil) ⇒ Object @@ -18319,49 +34221,43 @@

    -6098 -6099 -6100 -6101 -6102 -6103 -6104 -6105 -6106 -6107 -6108 -6109 -6110 -6111 -6112 -6113 -6114 -6115 -6116 -6117 +4975 +4976 +4977 +4978 +4979 +4980 +4981 +4982 +4983 +4984 +4985 +4986 +4987 +4988 +4989 +4990 +4991

    @@ -18369,9 +34265,9 @@

    -

    +

    - .apply_kettle_config_bootstrap(project_root, recipe, env: ENV) ⇒ Object + .finalize_gemfile_template_source(recipe, content, destination_content, facts:, template_content:) ⇒ Object @@ -18383,29 +34279,49 @@

     
     
    -6649
    -6650
    -6651
    -6652
    -6653
    -6654
    -6655
    -6656
    -6657
    -6658
    +5544 +5545 +5546 +5547 +5548 +5549 +5550 +5551 +5552 +5553 +5554 +5555 +5556 +5557 +5558 +5559 +5560 +5561 +5562 +5563

    @@ -18413,62 +34329,61 @@

    -

    +

    - .apply_kettle_config_bootstrap_profile(content, profile, gemspec_path) ⇒ Object + .finalize_github_workflow_template(content, facts = nil) ⇒ Object -

    -
    - +

    +
    +
    +
    +9541
    +9542
    +9543
    +9544
    +9545
    +9546
    +9547
    +9548
    +
    +
    # File 'lib/kettle/jem.rb', line 9541
    +
    +def filter_recipe_pack(pack, template_selection)
    +  patterns = recipe_filter_patterns(template_selection)
    +  return pack if patterns.empty?
     
    -  content
    +  pack.merge(
    +    recipes: pack.fetch(:recipes).select { |recipe| selected_template_path?(recipe.fetch(:target_path), patterns) }
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 6098
    -
    -def apply_configured_gemspec_required_ruby_version(content, facts, receiver:)
    -  return remove_gemspec_assignment(content, receiver: receiver, field: "required_ruby_version") if explicit_zero_runtime_floor?(facts)
    +      
    # File 'lib/kettle/jem.rb', line 4975
     
    -  min_ruby = minimum_ruby_token(facts.to_h.dig(:rubygems, :min_ruby))
    -  if min_ruby.to_s.empty?
    -    return content
    +def finalize_accepted_template_source(recipe, content, destination_content, facts:, project_root: nil)
    +  case template_file_type(recipe)
    +  when :gemfile
    +    finalize_gemfile_template_source(recipe, content, destination_content, facts: facts, template_content: content)
    +  when :appraisals
    +    merge_appraisals_template_policy(content, facts: facts)
    +  when :gemspec
    +    package_name = facts.dig(:package, :name).to_s if facts
    +    receiver = gemspec_block_param(content) || "spec"
    +    pruned = remove_gemspec_self_dependency_lines(content, package_name, receiver: receiver)
    +    rewrite_gemspec_version_loader(pruned, facts: facts)
    +  when :toml
    +    preserve_mise_project_settings(recipe, content, destination_content, project_root: project_root)
    +  else
    +    content
       end
    -
    -  replacement = %(#{receiver}.required_ruby_version = ">= #{min_ruby}")
    -  existing = gemspec_assignment_records(content, receiver: receiver).find { |record| record.fetch(:field) == "required_ruby_version" }
    -  return replace_source_range_lines(content, existing.fetch(:start_line), existing.fetch(:end_line), "#{leading_whitespace(existing.fetch(:source))}#{replacement}\n") if existing
    -
    -  licenses = gemspec_assignment_records(content, receiver: receiver).find { |record| record.fetch(:field) == "licenses" }
    -  return insert_lines_after(content, licenses.fetch(:end_line), "  #{replacement}\n") if licenses
    -
    -  homepage = gemspec_assignment_records(content, receiver: receiver).find { |record| record.fetch(:field) == "homepage" }
    -  return insert_lines_after(content, homepage.fetch(:end_line), "  #{replacement}\n") if homepage
    -
    -  content
     end
    -
    # File 'lib/kettle/jem.rb', line 6649
    +      
    # File 'lib/kettle/jem.rb', line 5544
     
    -def apply_kettle_config_bootstrap(project_root, recipe, env: ENV)
    -  content = recipe_template_content(project_root, recipe)
    -  tokens = stringify_template_tokens(recipe.fetch(:template_tokens, {}))
    -  content = resolve_template_tokens(content, tokens, scan_unresolved: false)
    -  bootstrap_licenses = Array(recipe[:bootstrap_licenses]).map(&:to_s).reject(&:empty?)
    -  content = replace_kettle_config_bootstrap_licenses(content, bootstrap_licenses) unless bootstrap_licenses.empty?
    -  content = replace_kettle_config_bootstrap_project_emoji(content, recipe[:bootstrap_project_emoji]) unless recipe[:bootstrap_project_emoji].to_s.empty?
    -  content = apply_kettle_config_bootstrap_profile(content, recipe[:bootstrap_template_profile], recipe[:bootstrap_gemspec_path])
    -  sync_kettle_config_env_overrides(content, env)
    +def finalize_gemfile_template_source(recipe, content, destination_content, facts:, template_content:)
    +  output = merge_gemfile_template_policy(
    +    content,
    +    facts: facts,
    +    template_content: template_content,
    +    preserve_self_word_entries: local_gemfile_template_recipe?(recipe)
    +  )
    +  if recipe.fetch(:target_path).to_s == "Gemfile"
    +    output = inject_main_gemfile_recording_eval(output, facts)
    +    output = remove_stale_main_gemfile_direct_sibling_block(output, template_content)
    +    output = deduplicate_main_gemfile_direct_sibling_blocks(output)
    +    output = ensure_main_gemfile_nomono_bootstrap(output, template_content)
    +    output = normalize_main_gemfile_nomono_requirements(output)
    +    output = guard_main_gemfile_runtime_workspace_overrides(output)
    +  end
    +  return output if recipe.dig(:template_preference, :strategy).to_s == "accept_template"
    +  return output unless local_gemfile_template_recipe?(recipe)
    +
    +  merge_local_gem_overrides(output, destination_content, facts: facts, template_content: template_content)
     end
    + + + + +
    +
     
     
    -  
    +6225
    +6226
    +6227
    +
    +
    # File 'lib/kettle/jem.rb', line 6225
    +
    +def finalize_github_workflow_template(content, facts = nil)
    +  inject_framework_matrix_workflow_env(update_github_actions_pins(content), facts)
    +end
    +
    -
    + +
    +

    -

    Raises:

    -
      + .finalize_rubocop_config(content) ⇒ Object -
    • - - - (Error) - - - -
    • + -
    -

    + +
    @@ -18476,9 +34391,9 @@

    -

    +

    - .apply_markdown_conditional_block(content, name, keep:) ⇒ Object + .finalize_template_source_content(recipe, content) ⇒ Object @@ -18490,55 +34405,21 @@

     
     
    -4501
    -4502
    -4503
    -4504
    -4505
    -4506
    -4507
    -4508
    -4509
    -4510
    -4511
    -4512
    -4513
    -4514
    -4515
    -4516
    -4517
    -4518
    -4519
    -4520
    -4521
    -4522
    -4523
    +4963 +4964 +4965 +4966 +4967 +4968

    @@ -18546,9 +34427,9 @@

    -

    +

    - .apply_monorepo_root_template_profile(content) ⇒ Object + .first_grapheme(text) ⇒ Object @@ -18560,57 +34441,15 @@

     
     
    -6899
    -6900
    -6901
    -6902
    -6903
    -6904
    -6905
    -6906
    -6907
    -6908
    -6909
    -6910
    -6911
    -6912
    -6913
    -6914
    -6915
    -6916
    -6917
    -6918
    -6919
    -6920
    -6921
    -6922
    +9443 +9444 +9445

    @@ -18618,9 +34457,9 @@

    -

    +

    - .apply_monorepo_subgem_readme_recipe(content, facts) ⇒ Object + .forge_facts(config, env, derived_github_user: nil) ⇒ Object @@ -18632,31 +34471,29 @@

     
     
    -4525
    -4526
    -4527
    -4528
    -4529
    -4530
    -4531
    -4532
    -4533
    -4534
    -4535
    +10814 +10815 +10816 +10817 +10818 +10819 +10820 +10821 +10822 +10823

    @@ -18664,9 +34501,9 @@

    -

    +

    - .apply_monorepo_subgem_template_profile(content, gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE) ⇒ Object + .forge_template_tokens(forge) ⇒ Object @@ -18678,81 +34515,25 @@

     
     
    -6924
    -6925
    -6926
    -6927
    -6928
    -6929
    -6930
    -6931
    -6932
    -6933
    -6934
    -6935
    -6936
    -6937
    -6938
    -6939
    -6940
    -6941
    -6942
    -6943
    -6944
    -6945
    -6946
    -6947
    -6948
    -6949
    -6950
    -6951
    -6952
    -6953
    -6954
    -6955
    -6956
    -6957
    -6958
    -6959
    +10829 +10830 +10831 +10832 +10833 +10834 +10835 +10836

    @@ -18760,9 +34541,9 @@

    -

    +

    - .apply_monorepo_subgem_thin_readme_projection(content, facts) ⇒ Object + .forge_user_value(forge_config, env, key, derived_value: nil) ⇒ Object @@ -18774,55 +34555,15 @@

    -4537 -4538 -4539 -4540 -4541 -4542 -4543 -4544 -4545 -4546 -4547 -4548 -4549 -4550 -4551 -4552 -4553 -4554 -4555 -4556 -4557 -4558 -4559 +10825 +10826 +10827

    @@ -18830,9 +34571,9 @@

    -

    +

     
     
    -3112
    -3113
    -3114
    -3115
    -3116
    -3117
    -3118
    -3119
    -3120
    -3121
    -3122
    -3123
    -3124
    -3125
    -3126
    -3127
    -3128
    -3129
    -3130
    +10795 +10796 +10797 +10798 +10799 +10800 +10801 +10802 +10803 +10804 +10805 +10806 +10807 +10808 +10809 +10810 +10811 +10812

    @@ -18892,9 +34631,9 @@

    -

    +

    - .apply_readme_badge_policy(content, facts) ⇒ Object + .framework_gemfile_path(gemfile) ⇒ Object @@ -18906,51 +34645,15 @@

     
     
    -4468
    -4469
    -4470
    -4471
    -4472
    -4473
    -4474
    -4475
    -4476
    -4477
    -4478
    -4479
    -4480
    -4481
    -4482
    -4483
    -4484
    -4485
    -4486
    -4487
    -4488
    +13922 +13923 +13924

    @@ -18958,9 +34661,9 @@

    -

    +

    - .apply_readme_conditional_blocks(content, facts) ⇒ Object + .framework_matrix_appraisal_block(entry) ⇒ Object @@ -18972,19 +34675,29 @@

     
     
    -4462
    -4463
    -4464
    -4465
    -4466
    +7124 +7125 +7126 +7127 +7128 +7129 +7130 +7131 +7132 +7133

    @@ -18992,9 +34705,9 @@

    -

    +

    - .apply_readme_kloc_badge(content, facts, project_root) ⇒ Object + .framework_matrix_appraisal_dependency_gemfiles(facts) ⇒ Object @@ -19006,27 +34719,23 @@

     
     
    -4413
    -4414
    -4415
    -4416
    -4417
    -4418
    -4419
    -4420
    -4421
    +7021 +7022 +7023 +7024 +7025 +7026 +7027

    @@ -19034,9 +34743,9 @@

    -

    +

    - .apply_readme_style(project_root, env: ENV) ⇒ Object + .framework_matrix_appraisal_env_by_name(facts) ⇒ Object @@ -19048,27 +34757,23 @@

     
     
    -3481
    -3482
    -3483
    -3484
    -3485
    -3486
    -3487
    -3488
    -3489
    +6260 +6261 +6262 +6263 +6264 +6265 +6266

    @@ -19076,9 +34781,9 @@

    -

    +

    - .apply_recipe_report(project_root, recipe_report) ⇒ Object + .framework_matrix_appraisal_gemfile_path(path) ⇒ Object @@ -19090,31 +34795,15 @@

     
     
    -7747
    -7748
    -7749
    -7750
    -7751
    -7752
    -7753
    -7754
    -7755
    -7756
    -7757
    +13788 +13789 +13790

    @@ -19122,9 +34811,9 @@

    -

    +

    - .apply_template_source(project_root, recipe, original, facts: nil, env: ENV) ⇒ Object + .framework_matrix_appraisal_gemfiles(raw) ⇒ Object @@ -19136,123 +34825,21 @@

     
     
    -4200
    -4201
    -4202
    -4203
    -4204
    -4205
    -4206
    -4207
    -4208
    -4209
    -4210
    -4211
    -4212
    -4213
    -4214
    -4215
    -4216
    -4217
    -4218
    -4219
    -4220
    -4221
    -4222
    -4223
    -4224
    -4225
    -4226
    -4227
    -4228
    -4229
    -4230
    -4231
    -4232
    -4233
    -4234
    -4235
    -4236
    -4237
    -4238
    -4239
    -4240
    -4241
    -4242
    -4243
    -4244
    -4245
    -4246
    -4247
    -4248
    -4249
    -4250
    -4251
    -4252
    -4253
    -4254
    -4255
    -4256
    +13781 +13782 +13783 +13784 +13785 +13786

    @@ -19260,9 +34847,9 @@

    -

    +

    - .appraisal_all_versions_for(resolver:, gem_name:, mode:, requirements: nil, include_versions: nil, exclude_versions: nil) ⇒ Object + .framework_matrix_appraisal_name(dimension, slug) ⇒ Object @@ -19274,25 +34861,15 @@

     
     
    -2458
    -2459
    -2460
    -2461
    -2462
    -2463
    -2464
    -2465
    +13792 +13793 +13794

    @@ -19300,9 +34877,9 @@

    -

    +

    - .appraisal_assign_version_buckets(selected_versions:, seams:, buckets:, bucket_ranges:, all_versions:) ⇒ Object + .framework_matrix_env(raw) ⇒ Object @@ -19314,39 +34891,29 @@

     
     
    -2227
    -2228
    -2229
    -2230
    -2231
    -2232
    -2233
    -2234
    -2235
    -2236
    -2237
    -2238
    -2239
    -2240
    -2241
    +13822 +13823 +13824 +13825 +13826 +13827 +13828 +13829 +13830 +13831

    @@ -19354,66 +34921,35 @@

    -

    - - .appraisal_block_has_matrix_dependency_gemfile?(block, matrix_dependency_gemfiles) ⇒ Boolean +

    - + .framework_matrix_replaced_appraisal_names(dimension, entry, name) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -6890
    -6891
    -6892
    -6893
    -6894
    -6895
    -6896
    -6897
    +4970 +4971 +4972 +4973
    -
    # File 'lib/kettle/jem.rb', line 6890
    -
    -def apply_kettle_config_bootstrap_profile(content, profile, gemspec_path)
    -  return content if profile.to_s.empty?
    -  return replace_yaml_scalar_path(content, %w[templates profile], FULL_TEMPLATE_PROFILE) if profile.to_s == FULL_TEMPLATE_PROFILE
    -  return apply_monorepo_root_template_profile(content) if profile.to_s == MONOREPO_ROOT_TEMPLATE_PROFILE
    -  return apply_monorepo_subgem_template_profile(content, gemspec_path, profile) if monorepo_subgem_template_profile_value?(profile)
    +      
    # File 'lib/kettle/jem.rb', line 4970
     
    -  raise Error, "Unknown kettle-jem template profile: #{profile}"
    +def finalize_rubocop_config(content)
    +  finalized = remove_yaml_scalar_path(content, %w[AllCops TargetRubyVersion])
    +  ensure_yaml_top_level_sequence_items(finalized, "plugins", ["rubocop-rspec"])
     end
    -
    # File 'lib/kettle/jem.rb', line 4501
    +      
    # File 'lib/kettle/jem.rb', line 4963
     
    -def apply_markdown_conditional_block(content, name, keep:)
    -  start_text = "KJ:#{name}:START"
    -  end_text = "KJ:#{name}:END"
    -  if keep
    -    processed = delete_markdown_with_ast_crispr(
    -      content,
    -      Ast::Crispr::Markdown::Markly::Selectors.html_comment(text: start_text, limit: {at_least: 0})
    -    )
    -    delete_markdown_with_ast_crispr(
    -      processed,
    -      Ast::Crispr::Markdown::Markly::Selectors.html_comment(text: end_text, limit: {at_least: 0})
    -    )
    -  else
    -    delete_markdown_with_ast_crispr(
    -      content,
    -      Ast::Crispr::Markdown::Markly::Selectors.html_comment_block(
    -        start_text: start_text,
    -        end_text: end_text,
    -        limit: {at_least: 0}
    -      )
    -    )
    -  end
    +def finalize_template_source_content(recipe, content)
    +  return finalize_rubocop_config(content) if recipe.fetch(:target_path).to_s == ".rubocop.yml"
    +  return normalize_spec_helper_simplecov_template_source(content) if recipe.fetch(:target_path).to_s == "spec/spec_helper.rb"
    +
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 6899
    +      
    # File 'lib/kettle/jem.rb', line 9443
     
    -def apply_monorepo_root_template_profile(content)
    -  entry_lines = MONOREPO_ROOT_TEMPLATE_ENTRIES.map { |entry| "    - #{entry}" }
    -  profiled_content = replace_yaml_scalar_path(content, %w[templates profile], MONOREPO_ROOT_TEMPLATE_PROFILE)
    -  entries_block = ["  entries:", *entry_lines].join("\n")
    -  updated = insert_after_line_sequence(
    -    profiled_content,
    -    ["templates:", "  root: packaged", "  apply: true", "  profile: #{MONOREPO_ROOT_TEMPLATE_PROFILE}"],
    -    entries_block,
    -    nil
    -  )
    -  if updated == profiled_content
    -    updated = insert_after_line_sequence(
    -      profiled_content,
    -      ["templates:", "  root: packaged", "  apply: true"],
    -      entries_block,
    -      "Could not apply monorepo-root template profile to .kettle-jem.yml bootstrap template"
    -    )
    -  end
    -  if updated == profiled_content
    -    raise Error,
    -      "Could not apply monorepo-root template profile to .kettle-jem.yml bootstrap template"
    -  end
    -  add_monorepo_root_file_overrides(updated)
    +def first_grapheme(text)
    +  text.to_s.strip[/\A\X/u].to_s
     end
    -
    # File 'lib/kettle/jem.rb', line 4525
    -
    -def apply_monorepo_subgem_readme_recipe(content, facts)
    -  return content unless monorepo_subgem_template_profile?(facts)
    -
    -  source_url = facts.dig(:package, :source_url).to_s
    -  return content if source_url.empty?
    +      
    # File 'lib/kettle/jem.rb', line 10814
     
    -  root_doc_links = MONOREPO_SUBGEM_README_BLOB_PATHS.to_h do |path|
    -    [path, source_blob_url(source_url, path)]
    -  end
    -  rewrite_markdown_reference_links(content, root_doc_links)
    +def forge_facts(config, env, derived_github_user: nil)
    +  token_config = token_config_values(config)
    +  forge_config = token_config["forge"].is_a?(Hash) ? token_config["forge"] : {}
    +  compact_hash(
    +    gh_user: forge_user_value(forge_config, env, :gh_user, derived_value: derived_github_user).to_s,
    +    gl_user: forge_user_value(forge_config, env, :gl_user).to_s,
    +    cb_user: forge_user_value(forge_config, env, :cb_user).to_s,
    +    sh_user: forge_user_value(forge_config, env, :sh_user).to_s
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 6924
    -
    -def apply_monorepo_subgem_template_profile(content, gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE)
    -  entries = monorepo_subgem_template_entries(gemspec_path, profile)
    -  entry_lines = entries.flat_map do |entry|
    -    if entry.is_a?(Hash)
    -      [
    -        "    - source: #{entry.fetch("source")}",
    -        "      target: #{entry.fetch("target")}"
    -      ]
    -    else
    -      ["    - #{entry}"]
    -    end
    -  end
    -  normalized_profile = normalize_template_profile(profile)
    -  profiled_content = replace_yaml_scalar_path(content, %w[templates profile], normalized_profile)
    -  entries_block = ["  entries:", *entry_lines].join("\n")
    -  updated = insert_after_line_sequence(
    -    profiled_content,
    -    ["templates:", "  root: packaged", "  apply: true", "  profile: #{normalized_profile}"],
    -    entries_block,
    -    nil
    -  )
    -  if updated == profiled_content
    -    updated = insert_after_line_sequence(
    -      profiled_content,
    -      ["templates:", "  root: packaged", "  apply: true"],
    -      entries_block,
    -      "Could not apply monorepo-subgem template profile to .kettle-jem.yml bootstrap template"
    -    )
    -  end
    -  if updated == profiled_content
    -    raise Error,
    -      "Could not apply #{normalized_profile} template profile to .kettle-jem.yml bootstrap template"
    -  end
    +      
    # File 'lib/kettle/jem.rb', line 10829
     
    -  add_monorepo_subgem_file_overrides(updated, gemspec_path, normalized_profile)
    +def forge_template_tokens(forge)
    +  {
    +    "KJ|GH:USER" => forge[:gh_user].to_s,
    +    "KJ|GL:USER" => forge[:gl_user].to_s,
    +    "KJ|CB:USER" => forge[:cb_user].to_s,
    +    "KJ|SH:USER" => forge[:sh_user].to_s
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 4537
    -
    -def apply_monorepo_subgem_thin_readme_projection(content, facts)
    -  return content unless monorepo_subgem_template_profile?(facts)
    +      
    # File 'lib/kettle/jem.rb', line 10825
     
    -  context = Ast::Crispr::Markdown::Markly.document_context(content: content, source_label: "README.md")
    -  link_definitions = context.structural_owners(owner_scope: :link_definitions)
    -  heading_sections = context.structural_owners(owner_scope: :heading_sections)
    -  removable = heading_sections.each_with_index.select do |owner, index|
    -    owner.level.to_i > 1 && !MONOREPO_SUBGEM_THIN_README_KEEP_HEADINGS.include?(owner.base.to_s)
    -  end.reject do |owner, index|
    -    markdown_heading_has_preserved_readme_ancestor?(heading_sections, index)
    -  end.map(&:first)
    -  projected = removable.reverse.reduce(content.to_s) do |processed, owner|
    -    delete_markdown_with_ast_crispr(
    -      processed,
    -      Ast::Crispr::Markdown::Markly::Selectors.heading_section(
    -        heading_text: owner.heading_text,
    -        level: owner.level,
    -        limit: {at_least: 0}
    -      )
    -    )
    -  end
    -  append_missing_markdown_link_definitions(projected, link_definitions)
    +def forge_user_value(forge_config, env, key, derived_value: nil)
    +  preferred_template_token_value(derived_value, forge_config[key.to_s], env, FORGE_USER_ENV_KEYS.fetch(key))
     end
    -
    # File 'lib/kettle/jem.rb', line 3112
    +      
    # File 'lib/kettle/jem.rb', line 10795
     
    -def apply_project(project_root, env: ENV, run_options: {})
    -  report = plan_project(project_root, env: env, run_options: run_options).merge(mode: "apply")
    -  before_apply_files = snapshot_changed_files(
    -    project_root,
    -    report.fetch(:recipe_reports).filter_map { |entry| entry[:relative_path] }
    -  )
    -  run_apply_phases(project_root, report)
    -  report[:changed_files] = actual_changed_files_after_apply(project_root, report.fetch(:changed_files), before_apply_files)
    -  report[:post_apply_steps] = post_apply_steps(project_root, report)
    -  report[:changed_files] = (report.fetch(:changed_files, []) + report.fetch(:post_apply_steps).flat_map do |step|
    -    step.fetch(:changed_files, [])
    -  end).uniq.sort
    -  report[:duplicate_drift] = duplicate_drift_report(
    -    project_root: project_root,
    -    template_root: template_root_path(project_root, config: kettle_jem_config(project_root)),
    -    run_options: run_options
    -  )
    -  report
    +def format_copyright_years(years)
    +  sorted = Array(years).map(&:to_i).reject(&:zero?).sort.uniq
    +  return Time.now.utc.year.to_s if sorted.empty?
    +  return sorted.first.to_s if sorted.one?
    +
    +  runs = []
    +  run = [sorted.first]
    +  sorted[1..].to_a.each do |year|
    +    if year == run.last + 1
    +      run << year
    +    else
    +      runs << run
    +      run = [year]
    +    end
    +  end
    +  runs << run
    +  runs.map { |span| span.one? ? span.first.to_s : "#{span.first}-#{span.last}" }.join(", ")
     end
    -
    # File 'lib/kettle/jem.rb', line 4468
    +      
    # File 'lib/kettle/jem.rb', line 13922
     
    -def apply_readme_badge_policy(content, facts)
    -  processed = remove_readme_badge_and_refs(content, README_CODETRIAGE_BADGE, README_CODETRIAGE_LINK_LABELS)
    -  if facts.dig(:readme_style, :fossa_project).to_s.empty?
    -    processed = remove_readme_badge_and_refs(processed, README_FOSSA_BADGE, README_FOSSA_LINK_LABELS)
    -  end
    -  unless Array(facts.dig(:license, :spdx)).map(&:to_s).include?("MIT")
    -    processed = remove_readme_badge_and_refs(
    -      processed,
    -      README_LICENSE_EYE_WORKFLOW_BADGE,
    -      README_LICENSE_EYE_WORKFLOW_LINK_LABELS
    -    )
    -  end
    -  if facts.dig(:funding, :open_collective_disabled)
    -    processed = remove_readme_badge_and_refs(
    -      processed,
    -      README_OPEN_COLLECTIVE_FUNDING_BADGES,
    -      README_OPEN_COLLECTIVE_LINK_LABELS
    -    )
    -  end
    -  processed
    +def framework_gemfile_path(gemfile)
    +  gemfile.include?("/") ? gemfile : "gemfiles/#{gemfile}"
     end
    -
    # File 'lib/kettle/jem.rb', line 4462
    +      
    # File 'lib/kettle/jem.rb', line 7124
     
    -def apply_readme_conditional_blocks(content, facts)
    -  open_collective_enabled = !facts.dig(:funding, :open_collective_disabled)
    -  processed = apply_markdown_conditional_block(content, "OPEN_COLLECTIVE", keep: open_collective_enabled)
    -  apply_markdown_conditional_block(processed, "NO_OPEN_COLLECTIVE", keep: !open_collective_enabled)
    +def framework_matrix_appraisal_block(entry)
    +  lines = [
    +    %(appraise "#{entry.fetch(:name)}" do)
    +  ]
    +  entry.fetch(:eval_gemfiles).each do |gemfile|
    +    lines << %(  eval_gemfile "#{gemfile}")
    +  end
    +  lines << "end"
    +  lines.join("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 4413
    -
    -def apply_readme_kloc_badge(content, facts, project_root)
    -  kloc = readme_kloc_from_changelog(project_root, facts.dig(:project_runtime, :version))
    -  return content if kloc.to_s.empty?
    +      
    # File 'lib/kettle/jem.rb', line 7021
     
    -  content.to_s.gsub(
    -    /(\[🧮kloc-img\]:\s*https?:\/\/img\.shields\.io\/badge\/KLOC-)(\d+(?:\.\d+)?)(-[^\s]*)/,
    -    "\\1#{kloc}\\3"
    -  )
    +def framework_matrix_appraisal_dependency_gemfiles(facts)
    +  framework_matrix = facts.to_h.dig(:ci, :framework_matrix).to_h
    +  [
    +    *framework_matrix.fetch(:appraisals, []).flat_map { |entry| entry.fetch(:eval_gemfiles, []) },
    +    *framework_matrix.fetch(:gemfiles, []).map { |entry| entry.fetch(:path).to_s.delete_prefix("gemfiles/") }
    +  ].map(&:to_s).to_set
     end
    -
    # File 'lib/kettle/jem.rb', line 3481
    -
    -def apply_readme_style(project_root, env: ENV)
    -  report = plan_readme_style(project_root, env: env).merge(mode: "apply")
    -  return report unless report.fetch(:changed)
    +      
    # File 'lib/kettle/jem.rb', line 6260
     
    -  path = File.join(project_root, report.fetch(:readme_path))
    -  FileUtils.mkdir_p(File.dirname(path))
    -  File.write(path, report.fetch(:final_content))
    -  report
    +def framework_matrix_appraisal_env_by_name(facts)
    +  entries = facts.to_h.dig(:ci, :framework_matrix, :appraisals).to_a
    +  entries.to_h do |entry|
    +    env = {"KJ_FRAMEWORK_MATRIX_GEM" => entry.fetch(:gem).to_s}.merge(entry.fetch(:env, {}).transform_keys(&:to_s))
    +    [entry.fetch(:name).to_s, env.reject { |_key, value| value.to_s.empty? }]
    +  end.reject { |_name, env| env.empty? }
     end
    -
    # File 'lib/kettle/jem.rb', line 7747
    +      
    # File 'lib/kettle/jem.rb', line 13788
     
    -def apply_recipe_report(project_root, recipe_report)
    -  return unless recipe_report[:changed]
    -
    -  path = File.join(project_root, recipe_report.fetch(:relative_path))
    -  if recipe_report.dig(:metadata, :delete_file)
    -    FileUtils.rm_f(path)
    -  else
    -    FileUtils.mkdir_p(File.dirname(path))
    -    File.write(path, recipe_report.fetch(:final_content))
    -  end
    +def framework_matrix_appraisal_gemfile_path(path)
    +  path.to_s.sub(%r{\Agemfiles/}, "")
     end
    -
    # File 'lib/kettle/jem.rb', line 4200
    -
    -def apply_template_source(project_root, recipe, original, facts: nil, env: ENV)
    -  strategy = recipe.dig(:template_preference, :strategy).to_s
    -  return original if strategy == "keep_destination"
    -
    -  content = recipe_template_content(project_root, recipe)
    -  return finalize_github_workflow_template(content, facts) if strategy == "raw_copy" && github_workflow_template_recipe?(recipe)
    -  return finalize_template_source_content(recipe, content) if strategy == "raw_copy"
    -
    -  resolved = resolve_template_tokens(
    -    content,
    -    recipe.fetch(:template_tokens, {}),
    -    scan_unresolved: unresolved_template_scan?(recipe)
    -  )
    -rescue ArgumentError => e
    -  raise ArgumentError, "#{recipe.fetch(:target_path)}: #{e.message}"
    -else
    -  resolved = prepare_readme_template(resolved, recipe[:readme_style]) if recipe.fetch(:target_path) == "README.md"
    -  resolved = prepare_github_workflow_template(resolved, recipe, facts)
    -  if recipe.fetch(:target_path) == "README.md" && (strategy.empty? || strategy == "merge")
    -    processed = postprocess_readme_content(
    -      merge_readme_template(
    -        template_content: resolved,
    -        destination_content: original,
    -        preserve_config: recipe.dig(:template_preference, :readme_preserve_config) || {}
    -      ),
    -      facts,
    -      project_root: project_root
    -    )
    -    return append_used_markdown_link_definitions(processed, resolved)
    -  end
    -  if strategy.empty? || strategy == "merge"
    -    merged = merge_config_template_source(recipe, resolved, original, facts: facts, env: env)
    -    merged = preserve_mise_project_settings(recipe, merged, original, project_root: project_root) if template_file_type(recipe) == :toml
    -    return sync_kettle_config_env_overrides(merged, env) if recipe.fetch(:target_path) == KETTLE_CONFIG_PATH
    -
    -    if github_workflow_template_recipe?(recipe)
    -      merged = preserve_github_workflow_project_settings(recipe, merged, original, project_root: project_root)
    -      return finalize_github_workflow_template(merged, facts)
    -    end
    -
    -    return finalize_template_source_content(recipe, merged)
    -  end
    -  if strategy == "accept_template"
    -    accepted = finalize_accepted_template_source(recipe, resolved, original, facts: facts, project_root: project_root)
    -    accepted = preserve_github_workflow_project_settings(recipe, accepted, original, project_root: project_root) if github_workflow_template_recipe?(recipe)
    -    accepted = sync_kettle_config_env_overrides(accepted, env) if recipe.fetch(:target_path) == KETTLE_CONFIG_PATH
    -    accepted = finalize_github_workflow_template(accepted, facts) if github_workflow_template_recipe?(recipe)
    -    return postprocess_readme_content(accepted, facts, project_root: project_root) if recipe.fetch(:target_path) == "README.md"
    +      
    # File 'lib/kettle/jem.rb', line 13781
     
    -    return finalize_template_source_content(recipe, accepted)
    +def framework_matrix_appraisal_gemfiles(raw)
    +  Array(raw["appraisal_gemfiles"] || raw["appraisal_eval_gemfiles"]).filter_map do |path|
    +    normalized = framework_matrix_appraisal_gemfile_path(path.to_s.strip)
    +    normalized unless normalized.empty?
       end
    -
    -  resolved = finalize_github_workflow_template(resolved, facts) if github_workflow_template_recipe?(recipe)
    -  return postprocess_readme_content(resolved, facts, project_root: project_root) if recipe.fetch(:target_path) == "README.md"
    -
    -  finalize_template_source_content(recipe, resolved)
     end
    -
    # File 'lib/kettle/jem.rb', line 2458
    +      
    # File 'lib/kettle/jem.rb', line 13792
     
    -def appraisal_all_versions_for(resolver:, gem_name:, mode:, requirements: nil, include_versions: nil, exclude_versions: nil)
    -  base_versions = if mode.to_s == "patch"
    -    resolver.versions(gem_name, requirements: requirements).map { |entry| entry[:number] || entry["number"] }
    -  else
    -    resolver.minor_versions_by_major(gem_name, requirements: requirements).flat_map { |entry| entry[:minors] || entry["minors"] }
    -  end
    -  appraisal_finalize_versions(base_versions, include_versions: include_versions, exclude_versions: exclude_versions)
    +def framework_matrix_appraisal_name(dimension, slug)
    +  [dimension, slug].join("-").downcase.gsub(/[^a-z0-9]+/, "-").gsub(/\A-|-+\z/, "")
     end
    -
    # File 'lib/kettle/jem.rb', line 2227
    +      
    # File 'lib/kettle/jem.rb', line 13822
     
    -def appraisal_assign_version_buckets(selected_versions:, seams:, buckets:, bucket_ranges:, all_versions:)
    -  return [] if selected_versions.empty? || buckets.empty?
    +def framework_matrix_env(raw)
    +  return {} unless raw.is_a?(Hash)
     
    -  normalized_ranges = appraisal_normalized_bucket_ranges(bucket_ranges)
    -  version_min_rubies = appraisal_version_min_ruby_map(all_versions, seams)
    -  assignments = selected_versions.sort_by { |version| Gem::Version.new(version) }.filter_map do |version|
    -    min_ruby = version_min_rubies[version]
    -    next unless min_ruby
    +  raw.each_with_object({}) do |(key, value), result|
    +    name = key.to_s.strip
    +    next if name.empty?
     
    -    next_seam = appraisal_next_seam_ruby(version, min_ruby, all_versions, version_min_rubies)
    -    bucket = next_seam ? appraisal_bucket_below(next_seam, buckets, normalized_ranges) : buckets.last
    -    {version: version, bucket: bucket} if bucket
    +    result[name] = value.to_s
       end
    -  appraisal_fill_bucket_gaps(assignments, buckets, normalized_ranges, version_min_rubies, all_versions)
     end
    +
    @@ -19421,9 +34957,9 @@

    -

    +

    - .appraisal_blocks(content) ⇒ Object + .framework_matrix_version_entry(raw) ⇒ Object @@ -19435,41 +34971,59 @@

     
     
    -5872
    -5873
    -5874
    -5875
    -5876
    -5877
    -5878
    -5879
    -5880
    -5881
    -5882
    -5883
    -5884
    -5885
    -5886
    -5887
    +13796 +13797 +13798 +13799 +13800 +13801 +13802 +13803 +13804 +13805 +13806 +13807 +13808 +13809 +13810 +13811 +13812 +13813 +13814 +13815 +13816 +13817 +13818 +13819 +13820

    @@ -19477,39 +35031,62 @@

    -

    +

    - .appraisal_bucket_below(ruby_floor, buckets, bucket_ranges) ⇒ Object + .framework_matrix_workflow_enabled?(raw) ⇒ Boolean -

     
     
    -5625
    -5626
    -5627
    -5628
    -5629
    -5630
    -5631
    -5632
    -5633
    -5634
    +13765 +13766 +13767 +13768 +13769 +13770
    -
    # File 'lib/kettle/jem.rb', line 5625
    +      
    # File 'lib/kettle/jem.rb', line 13765
     
    -def appraisal_block_has_matrix_dependency_gemfile?(block, matrix_dependency_gemfiles)
    -  ruby_call_records(block, :eval_gemfile).any? do |call|
    -    path = ruby_string_argument(call).to_s
    -    next true if matrix_dependency_gemfiles.include?(path)
    +def framework_matrix_replaced_appraisal_names(dimension, entry, name)
    +  default_name = framework_matrix_appraisal_name(dimension, entry.fetch(:slug))
    +  return [] if default_name == name
     
    -    path.start_with?("modular/") &&
    -      path.delete_prefix("modular/").include?("/") &&
    -      !path.start_with?("modular/x_std_libs/")
    -  end
    +  [default_name]
     end
    -
    # File 'lib/kettle/jem.rb', line 5872
    +      
    # File 'lib/kettle/jem.rb', line 13796
     
    -def appraisal_blocks(content)
    -  lines = content.to_s.lines
    -  blocks = {}
    -  order = []
    -  records = appraisal_call_records(content)
    -  records.each do |record|
    -    name = record.fetch(:name)
    -    unless blocks.key?(name)
    -      blocks[name] = record.fetch(:source)
    -      order << name
    -    end
    +def framework_matrix_version_entry(raw)
    +  if raw.is_a?(Hash)
    +    label = raw.fetch("label", raw["version"]).to_s.strip
    +    slug = raw.fetch("slug", label).to_s.strip
    +    requirement = raw.fetch("requirement", default_framework_matrix_requirement(label)).to_s.strip
    +    appraisal_name = (raw["appraisal"] || raw["appraisal_name"] || raw["standard_appraisal"]).to_s.strip
    +    env = framework_matrix_env(raw["env"])
    +  else
    +    label = raw.to_s.strip
    +    slug = label
    +    requirement = default_framework_matrix_requirement(label)
    +    appraisal_name = ""
    +    env = {}
       end
    -  prelude_end = records.empty? ? lines.length : records.first.fetch(:start_line) - 1
    -  prelude = lines[0...prelude_end].join
    -  {prelude: prelude, blocks: blocks, order: order}
    +  return if label.empty? || slug.empty? || requirement.empty?
    +
    +  entry = {
    +    label: label,
    +    slug: slug,
    +    requirement: requirement
    +  }
    +  entry[:appraisal_name] = appraisal_name unless appraisal_name.empty?
    +  entry[:env] = env unless env.empty?
    +  entry
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -19517,9 +35094,9 @@

    -

    +

    - .appraisal_bucket_sort_key(bucket) ⇒ Object + .freeze_marker_blocks(content, freeze_token: nil) ⇒ Object @@ -19531,17 +35108,49 @@

     
     
    -2282
    -2283
    -2284
    -2285
    +8246 +8247 +8248 +8249 +8250 +8251 +8252 +8253 +8254 +8255 +8256 +8257 +8258 +8259 +8260 +8261 +8262 +8263 +8264 +8265

    @@ -19549,9 +35158,9 @@

    -

    +

    - .appraisal_call_records(content) ⇒ Object + .funding_platform_token_facts(config, env) ⇒ Object @@ -19563,37 +35172,29 @@

     
     
    -5906
    -5907
    -5908
    -5909
    -5910
    -5911
    -5912
    -5913
    -5914
    -5915
    -5916
    -5917
    -5918
    -5919
    +10838 +10839 +10840 +10841 +10842 +10843 +10844 +10845 +10846 +10847

    @@ -19601,68 +35202,29 @@

    -

    - - .appraisal_compatible_version_for_bucket?(resolver:, gem_name:, version:, ruby_series:, bucket_ranges:) ⇒ Boolean +

    - + .funding_platform_token_value(funding_config, env, key) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -2322
    -2323
    -2324
    -2325
    -2326
    -2327
    -2328
    -2329
    +13772 +13773 +13774 +13775 +13776 +13777 +13778 +13779
    -
    # File 'lib/kettle/jem.rb', line 2322
    +      
    # File 'lib/kettle/jem.rb', line 13772
     
    -def appraisal_bucket_below(ruby_floor, buckets, bucket_ranges)
    -  buckets.filter_map do |bucket|
    -    range = bucket_ranges[bucket]
    -    next unless range && range.fetch(:ceiling) < ruby_floor
    +def framework_matrix_workflow_enabled?(raw)
    +  configured = raw["workflow"]
    +  configured = raw["generate_workflow"] if configured.nil?
    +  configured = raw["ci"] if configured.nil?
    +  return true if configured.nil?
     
    -    [bucket, range.fetch(:ceiling)]
    -  end.max_by(&:last)&.first
    +  DecisionPolicy.value_to_boolean(configured) != false
     end
    -
    # File 'lib/kettle/jem.rb', line 2282
    +      
    # File 'lib/kettle/jem.rb', line 8246
     
    -def appraisal_bucket_sort_key(bucket)
    -  match = bucket.to_s.match(/\Ar(\d+)(?:\.(\d+))?\z/)
    -  [match[1].to_i, match[2] ? match[2].to_i : 999]
    +def freeze_marker_blocks(content, freeze_token: nil)
    +  marker = freeze_token.to_s.empty? ? "kettle-jem" : freeze_token.to_s
    +  lines = content.to_s.lines
    +  blocks = []
    +  index = 0
    +  while index < lines.length
    +    unless lines[index].include?("# #{marker}:freeze")
    +      index += 1
    +      next
    +    end
    +
    +    start_index = index
    +    while index < lines.length
    +      index += 1
    +      break if lines[index - 1].include?("# #{marker}:unfreeze")
    +    end
    +    blocks << lines[start_index...index]
    +  end
    +  blocks
     end
    -
    # File 'lib/kettle/jem.rb', line 5906
    +      
    # File 'lib/kettle/jem.rb', line 10838
     
    -def appraisal_call_records(content)
    -  lines = content.to_s.lines
    -  ruby_call_records(content, :appraise).filter_map do |call|
    -    name = ruby_string_argument(call)
    -    next unless name
    -
    -    {
    -      name: name,
    -      start_line: call.location.start_line,
    -      end_line: call.location.end_line,
    -      source: (lines[(call.location.start_line - 1)..(call.location.end_line - 1)] || []).join
    -    }
    -  end
    +def funding_platform_token_facts(config, env)
    +  token_config = token_config_values(config)
    +  funding_config = token_config["funding"].is_a?(Hash) ? token_config["funding"] : {}
    +  compact_hash(
    +    kofi: funding_platform_token_value(funding_config, env, :kofi).to_s,
    +    paypal: funding_platform_token_value(funding_config, env, :paypal).to_s,
    +    buymeacoffee: funding_platform_token_value(funding_config, env, :buymeacoffee).to_s,
    +    liberapay: funding_platform_token_value(funding_config, env, :liberapay).to_s
    +  )
     end
    +
    @@ -19670,9 +35232,9 @@

    -

    +

    - .appraisal_eval_gemfile_path(path) ⇒ Object + .funding_template_tokens(funding) ⇒ Object @@ -19684,15 +35246,27 @@

     
     
    -2029
    -2030
    -2031
    +10853 +10854 +10855 +10856 +10857 +10858 +10859 +10860 +10861

    @@ -19700,9 +35274,9 @@

    -

    +

    - .appraisal_extract_runtime_dependencies(gemspec_content) ⇒ Object + .funding_urls(project_root, package_name, funding_uri: nil, opencollective_disabled: false, open_collective_org: nil) ⇒ Object @@ -19714,21 +35288,27 @@

     
     
    -2409
    -2410
    -2411
    -2412
    -2413
    -2414
    +9748 +9749 +9750 +9751 +9752 +9753 +9754 +9755 +9756

    @@ -19736,9 +35316,9 @@

    -

    +

    - .appraisal_file_content(matrix_entries) ⇒ Object + .gem_major_token(version) ⇒ Object @@ -19750,47 +35330,19 @@

     
     
    -2009
    -2010
    -2011
    -2012
    -2013
    -2014
    -2015
    -2016
    -2017
    -2018
    -2019
    -2020
    -2021
    -2022
    -2023
    -2024
    -2025
    -2026
    -2027
    +10580 +10581 +10582 +10583 +10584

    @@ -19798,105 +35350,52 @@

    -

    +

    - .appraisal_fill_bucket_gaps(assignments, buckets, bucket_ranges, version_min_rubies, all_versions) ⇒ Object + .gemfile_comment_line?(line) ⇒ Boolean -

     
     
    -2475
    -2476
    -2477
    -2478
    -2479
    -2480
    -2481
    -2482
    -2483
    -2484
    -2485
    +10849 +10850 +10851
    -
    # File 'lib/kettle/jem.rb', line 2475
    -
    -def appraisal_compatible_version_for_bucket?(resolver:, gem_name:, version:, ruby_series:, bucket_ranges:)
    -  range = bucket_ranges[ruby_series] || bucket_ranges[ruby_series.to_s]
    -  return true unless range
    +      
    # File 'lib/kettle/jem.rb', line 10849
     
    -  ceiling = Gem::Version.new((range[:ceiling] || range["ceiling"]).to_s)
    -  exact_version = appraisal_latest_minor_patch(resolver: resolver, gem_name: gem_name, version: version)
    -  min_ruby = resolver.min_ruby_version(gem_name, exact_version)
    -  min_ruby.nil? || Gem::Version.new(min_ruby.to_s) <= ceiling
    -rescue
    -  true
    +def funding_platform_token_value(funding_config, env, key)
    +  preferred_template_token_value(nil, funding_config[key.to_s], env, FUNDING_TOKEN_ENV_KEYS.fetch(key))
     end
    -
    # File 'lib/kettle/jem.rb', line 2029
    +      
    # File 'lib/kettle/jem.rb', line 10853
     
    -def appraisal_eval_gemfile_path(path)
    -  path.to_s.delete_prefix("gemfiles/")
    +def funding_template_tokens(funding)
    +  platform_tokens = funding.fetch(:platform_tokens, {})
    +  {
    +    "KJ|FUNDING:KOFI" => platform_tokens[:kofi].to_s,
    +    "KJ|FUNDING:PAYPAL" => platform_tokens[:paypal].to_s,
    +    "KJ|FUNDING:BUYMEACOFFEE" => platform_tokens[:buymeacoffee].to_s,
    +    "KJ|FUNDING:LIBERAPAY" => platform_tokens[:liberapay].to_s
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 2409
    +      
    # File 'lib/kettle/jem.rb', line 9748
     
    -def appraisal_extract_runtime_dependencies(gemspec_content)
    -  gemspec_dependency_records(gemspec_content)
    -    .reject { |record| record.fetch(:kind) == "add_development_dependency" }
    -    .map { |record| record.fetch(:name) }
    -    .uniq
    +def funding_urls(project_root, package_name, funding_uri: nil, opencollective_disabled: false, open_collective_org: nil)
    +  urls = [funding_uri]
    +  path = File.join(project_root, ".github", "FUNDING.yml")
    +  urls.concat(github_funding_urls(path, opencollective_disabled: opencollective_disabled)) if File.exist?(path)
    +  urls << github_funding_platform_urls("open_collective", [open_collective_org]).first unless opencollective_disabled
    +  urls << github_funding_platform_urls("tidelift", ["rubygems/#{package_name}"]).first
    +
    +  urls.compact.uniq.sort
     end
    -
    # File 'lib/kettle/jem.rb', line 2009
    +      
    # File 'lib/kettle/jem.rb', line 10580
     
    -def appraisal_file_content(matrix_entries)
    -  lines = [
    -    "# frozen_string_literal: true",
    -    "",
    -    "# Generated by kettle-jem",
    -    "# Do not edit directly; regenerate from Kettle/Jem appraisal matrix metadata.",
    -    ""
    -  ]
    -  matrix_entries.each do |entry|
    -    lines << %(appraise "#{entry.fetch(:name)}" do)
    -    lines << %(  eval_gemfile "#{appraisal_eval_gemfile_path(entry.fetch(:tier1_gemfile))}") if entry[:tier1_gemfile]
    -    lines << %(  eval_gemfile "#{appraisal_eval_gemfile_path(entry.fetch(:tier2_gemfile))}") if entry[:tier2_gemfile]
    -    lines << %(  eval_gemfile "#{appraisal_eval_gemfile_path(entry.fetch(:x_std_libs_gemfile))}") if entry[:x_std_libs_gemfile]
    -    lines << "end"
    -    lines << ""
    -  end
    -  lines.pop while lines.last == ""
    -  ensure_trailing_newline(lines.join("\n"))
    +def gem_major_token(version)
    +  Gem::Version.new(version.to_s).segments.first.to_s
    +rescue ArgumentError
    +  "0"
     end
    - - - - -
    -
    -
    -
    -2331
    -2332
    -2333
    -2334
    -2335
    -2336
    -2337
    -2338
    -2339
    -2340
    -2341
    -2342
    -2343
    -2344
    -2345
    -2346
    -2347
    -2348
    -
    -
    # File 'lib/kettle/jem.rb', line 2331
    +
    +
    + -def appraisal_fill_bucket_gaps(assignments, buckets, bucket_ranges, version_min_rubies, all_versions) - covered = assignments.map { |assignment| assignment.fetch(:bucket) } - (buckets - covered).each do |bucket| - range = bucket_ranges[bucket] - next unless range - filler = all_versions.sort_by { |version| Gem::Version.new(version) }.reverse.find do |version| - ruby = version_min_rubies[version] - ruby&.between?(range.fetch(:floor), range.fetch(:ceiling)) - end - filler ||= all_versions.sort_by { |version| Gem::Version.new(version) }.reverse.find do |version| - ruby = version_min_rubies[version] - ruby && ruby <= range.fetch(:ceiling) - end - assignments << {version: filler, bucket: bucket, filler: true} if filler - end - assignments.sort_by { |assignment| bucket_ranges.fetch(assignment.fetch(:bucket)).fetch(:floor) } -end
    -
    +
    - -
    -

    +
    - .appraisal_filtered_versions(version_metadata, requirements:) ⇒ Object +

    Returns:

    +
      - +
    • + + + (Boolean) + + + +
    • +
    - -

    +
    @@ -19904,37 +35403,52 @@

    -

    +

    - .appraisal_finalize_versions(base_versions, include_versions: nil, exclude_versions: nil) ⇒ Object + .gemfile_conditional_node?(node) ⇒ Boolean -

     
     
    -2173
    -2174
    -2175
    -2176
    -2177
    -2178
    -2179
    -2180
    -2181
    -2182
    -2183
    +6802 +6803 +6804
    -
    # File 'lib/kettle/jem.rb', line 2173
    -
    -def appraisal_filtered_versions(, requirements:)
    -  requirement = requirements ? Gem::Requirement.new(Array(requirements)) : nil
    -  .filter_map do |entry|
    -    number = entry[:number] || entry["number"]
    -    next if number.to_s.empty?
    -    next if entry[:prerelease] || entry["prerelease"]
    -    next if requirement && !requirement.satisfied_by?(Gem::Version.new(number))
    +      
    # File 'lib/kettle/jem.rb', line 6802
     
    -    number.to_s
    -  end.sort_by { |version| Gem::Version.new(version) }
    +def gemfile_comment_line?(line)
    +  line.to_s.lstrip.start_with?("#")
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -19942,51 +35456,74 @@

    -

    +

    - .appraisal_find_ruby_seams(version_metadata) ⇒ Object + .gemfile_declares_gem?(content, gem_name) ⇒ Boolean -

     
     
    -2467
    -2468
    -2469
    -2470
    -2471
    -2472
    -2473
    +6102 +6103 +6104
    -
    # File 'lib/kettle/jem.rb', line 2467
    -
    -def appraisal_finalize_versions(base_versions, include_versions: nil, exclude_versions: nil)
    -  merged = appraisal_sort_versions(Array(base_versions) + Array(include_versions))
    -  excluded = Array(exclude_versions).map(&:to_s).to_set
    -  return merged if excluded.empty?
    +      
    # File 'lib/kettle/jem.rb', line 6102
     
    -  appraisal_sort_versions(merged.reject { |version| excluded.include?(version) })
    +def gemfile_conditional_node?(node)
    +  node.is_a?(::Prism::IfNode) || node.is_a?(::Prism::UnlessNode)
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -19994,9 +35531,9 @@

    -

    +

    - .appraisal_format_version(version) ⇒ Object + .gemfile_dependency_insertion_line(content) ⇒ Object @@ -20008,15 +35545,27 @@

     
     
    -1968
    -1969
    -1970
    +6529 +6530 +6531 +6532 +6533 +6534 +6535 +6536 +6537

    @@ -20024,9 +35573,9 @@

    -

    +

    - .appraisal_gem_abbreviation(gem_name) ⇒ Object + .gemfile_dependency_names(content) ⇒ Object @@ -20038,15 +35587,15 @@

     
     
    -1964
    -1965
    -1966
    +4791 +4792 +4793

    @@ -20054,47 +35603,66 @@

    -

    +

    - .appraisal_latest_minor_patch(resolver:, gem_name:, version:) ⇒ Object + .gemfile_dependency_statement?(node) ⇒ Boolean -

     
     
    -2201
    -2202
    -2203
    -2204
    -2205
    -2206
    -2207
    -2208
    -2209
    -2210
    -2211
    -2212
    -2213
    -2214
    +3846 +3847 +3848 +3849 +3850 +3851 +3852 +3853 +3854 +3855 +3856 +3857 +3858 +3859
    -
    # File 'lib/kettle/jem.rb', line 2201
    +      
    # File 'lib/kettle/jem.rb', line 3846
     
    -def appraisal_find_ruby_seams()
    -  minors = appraisal_latest_patch_by_minor()
    -  seams = []
    -  previous = nil
    -  minors.sort_by { |minor, _entry| Gem::Version.new(minor) }.each do |minor, entry|
    -    min_ruby = Gem::Version.new((entry[:min_ruby] || entry["min_ruby"]).to_s)
    -    min_ruby = [min_ruby, DEFAULT_TEST_MINIMUM_RUBY].max
    -    if previous.nil? || min_ruby > previous
    -      seams << {version: minor, min_ruby: min_ruby}
    +def gemfile_declares_gem?(content, gem_name)
    +  ruby_call_records(content, nil).any? do |call|
    +    next false unless call.receiver.nil?
    +
    +    case call.name
    +    when :gem
    +      ruby_string_argument(call) == gem_name.to_s
    +    when :gemspec
    +      gemspec_path_declares_gem?(ruby_keyword_string_argument(call, :path), gem_name)
    +    else
    +      false
         end
    -    previous = min_ruby
       end
    -  seams
     end
    -
    # File 'lib/kettle/jem.rb', line 1968
    +      
    # File 'lib/kettle/jem.rb', line 6529
     
    -def appraisal_format_version(version)
    -  version.to_s.tr(".", "-")
    +def gemfile_dependency_insertion_line(content)
    +  body = prism_parse_success(content)&.value&.statements&.body || []
    +  node = body.find do |statement|
    +    gemfile_dependency_statement?(statement)
    +  end
    +  return content.to_s.lines.length unless node
    +
    +  node.location.start_line - 1
     end
    -
    # File 'lib/kettle/jem.rb', line 1964
    +      
    # File 'lib/kettle/jem.rb', line 4791
     
    -def appraisal_gem_abbreviation(gem_name)
    -  APPRAISAL_GEM_ABBREVIATIONS.fetch(gem_name.to_s, gem_name.to_s)
    +def gemfile_dependency_names(content)
    +  gemfile_gem_call_records(content).map { |record| record.fetch(:name) } + gemfile_nomono_dependency_names(content)
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -20102,9 +35670,9 @@

    -

    +

    - .appraisal_latest_patch_by_minor(version_metadata) ⇒ Object + .gemfile_eval_bucket_entries(content) ⇒ Object @@ -20116,30 +35684,52 @@

     
     
    -2243
    -2244
    -2245
    -2246
    -2247
    -2248
    -2249
    -2250
    -2251
    -2252
    -2253
    +6931 +6932 +6933 +6934 +6935 +6936 +6937 +6938 +6939 +6940 +6941 +6942 +6943 +6944 +6945 +6946 +6947 +6948 +6949 +6950 +6951 +6952

    @@ -20148,9 +35738,9 @@

    -

    +

    - .appraisal_latest_version_matching(version_metadata, requested_version) ⇒ Object + .gemfile_eval_comment_start_line(lines, start_line) ⇒ Object @@ -20162,23 +35752,23 @@

     
     
    -2374
    -2375
    -2376
    -2377
    -2378
    -2379
    -2380
    +6954 +6955 +6956 +6957 +6958 +6959 +6960

    @@ -20186,9 +35776,9 @@

    -

    +

    - .appraisal_matrix_entries(tier1_gems:, tier2_gems: []) ⇒ Object + .gemfile_eval_paths(content) ⇒ Object @@ -20200,73 +35790,15 @@

     
     
    -2124
    -2125
    -2126
    -2127
    -2128
    -2129
    -2130
    -2131
    -2132
    -2133
    -2134
    -2135
    -2136
    -2137
    -2138
    -2139
    -2140
    -2141
    -2142
    -2143
    -2144
    -2145
    -2146
    -2147
    -2148
    -2149
    -2150
    -2151
    -2152
    -2153
    -2154
    -2155
    +6490 +6491 +6492

    @@ -20274,9 +35806,9 @@

    -

    +

    - .appraisal_matrix_entry(tier1_name:, tier1_version:, ruby_series:, tier2_name: nil, tier2_version: nil) ⇒ Object + .gemfile_gem_call_records(content) ⇒ Object @@ -20288,39 +35820,33 @@

     
     
    -2157
    -2158
    -2159
    -2160
    -2161
    -2162
    -2163
    -2164
    -2165
    -2166
    -2167
    -2168
    -2169
    -2170
    -2171
    +6647 +6648 +6649 +6650 +6651 +6652 +6653 +6654 +6655 +6656 +6657 +6658

    @@ -20328,60 +35854,41 @@

    -

    - - .appraisal_matrix_fresh?(matrix, now: Time.now.to_i) ⇒ Boolean +

    - + .gemfile_nomono_dependency_names(content) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -2487
    -2488
    -2489
    -2490
    -2491
    -2492
    -2493
    -2494
    -2495
    -2496
    -2497
    -2498
    +6539 +6540 +6541 +6542 +6543 +6544 +6545 +6546 +6547 +6548
    -
    # File 'lib/kettle/jem.rb', line 2487
    +      
    # File 'lib/kettle/jem.rb', line 6539
     
    -def appraisal_latest_minor_patch(resolver:, gem_name:, version:)
    -  all_versions = resolver.versions(gem_name)
    -  prefix = "#{version}."
    -  matching = all_versions.select do |entry|
    -    number = (entry[:number] || entry["number"]).to_s
    -    number == version.to_s || number.start_with?(prefix)
    +def gemfile_dependency_statement?(node)
    +  case node
    +  when ::Prism::CallNode
    +    %i[gem group platforms].include?(node.name)
    +  when ::Prism::IfNode, ::Prism::UnlessNode
    +    true
    +  else
    +    false
       end
    -  return version.to_s if matching.empty?
    -
    -  latest = matching.max_by { |entry| Gem::Version.new((entry[:number] || entry["number"]).to_s) }
    -  (latest[:number] || latest["number"]).to_s
     end
    -
    # File 'lib/kettle/jem.rb', line 2243
    +      
    # File 'lib/kettle/jem.rb', line 6931
    +
    +def gemfile_eval_bucket_entries(content)
    +  lines = content.to_s.lines
    +  ruby_call_records(content, :eval_gemfile).filter_map do |call|
    +    path = ruby_string_argument(call)
    +    next unless path
     
    -def appraisal_latest_patch_by_minor()
    -  .each_with_object({}) do |entry, latest|
    -    number = (entry[:number] || entry["number"]).to_s
    -    next if number.empty?
    +    key = normalize_eval_gemfile_ruby_bucket(path)
    +    next unless key
     
    -    version = Gem::Version.new(number)
    -    minor = "#{version.segments[0]}.#{version.segments[1] || 0}"
    -    current = latest[minor]
    -    latest[minor] = entry if current.nil? || version > Gem::Version.new((current[:number] || current["number"]).to_s)
    +    start_line = call.location.start_line
    +    end_line = ruby_node_source_end_line(call)
    +    section_start_line = gemfile_eval_comment_start_line(lines, start_line)
    +    {
    +      path: path,
    +      key: key,
    +      line: (lines[(start_line - 1)..(end_line - 1)] || []).join,
    +      section_line: (lines[(section_start_line - 1)..(end_line - 1)] || []).join,
    +      start_line: start_line,
    +      end_line: end_line
    +    }
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 2374
    +      
    # File 'lib/kettle/jem.rb', line 6954
     
    -def appraisal_latest_version_matching(, requested_version)
    -  prefix = "#{requested_version}."
    -  .select do |entry|
    -    number = (entry[:number] || entry["number"]).to_s
    -    number == requested_version.to_s || number.start_with?(prefix)
    -  end.max_by { |entry| Gem::Version.new((entry[:number] || entry["number"]).to_s) }
    +def gemfile_eval_comment_start_line(lines, start_line)
    +  index = start_line.to_i - 2
    +  return start_line if index.negative?
    +
    +  index -= 1 while index >= 0 && lines.fetch(index).lstrip.start_with?("#")
    +  index + 2
     end
    -
    # File 'lib/kettle/jem.rb', line 2124
    +      
    # File 'lib/kettle/jem.rb', line 6490
     
    -def appraisal_matrix_entries(tier1_gems:, tier2_gems: [])
    -  entries = []
    -  tier1_gems.each do |tier1|
    -    tier1_name = tier1[:name] || tier1["name"]
    -    assignments = tier1[:assignments] || tier1["assignments"] || []
    -    assignments.each do |assignment|
    -      tier1_version = assignment[:version] || assignment["version"]
    -      ruby_series = assignment[:bucket] || assignment["bucket"] || assignment[:ruby_series] || assignment["ruby_series"]
    -      if tier2_gems.empty?
    -        entries << appraisal_matrix_entry(
    -          tier1_name: tier1_name,
    -          tier1_version: tier1_version,
    -          ruby_series: ruby_series
    -        )
    -      else
    -        tier2_gems.each do |tier2|
    -          tier2_name = tier2[:name] || tier2["name"]
    -          Array(tier2[:versions] || tier2["versions"]).each do |tier2_version|
    -            entries << appraisal_matrix_entry(
    -              tier1_name: tier1_name,
    -              tier1_version: tier1_version,
    -              ruby_series: ruby_series,
    -              tier2_name: tier2_name,
    -              tier2_version: tier2_version
    -            )
    -          end
    -        end
    -      end
    -    end
    -  end
    -  entries
    +def gemfile_eval_paths(content)
    +  ruby_call_records(content, :eval_gemfile).filter_map { |call| ruby_string_argument(call) }
     end
    -
    # File 'lib/kettle/jem.rb', line 2157
    +      
    # File 'lib/kettle/jem.rb', line 6647
     
    -def appraisal_matrix_entry(tier1_name:, tier1_version:, ruby_series:, tier2_name: nil, tier2_version: nil)
    -  {
    -    name: appraisal_name(
    -      tier1_gem: tier1_name,
    -      tier1_version: tier1_version,
    -      tier2_gem: tier2_name,
    -      tier2_version: tier2_version,
    -      ruby_series: ruby_series
    -    ),
    -    tier1_gemfile: appraisal_modular_gemfile_path(gem_name: tier1_name, version: tier1_version, ruby_series: ruby_series),
    -    tier2_gemfile: tier2_name ? appraisal_modular_gemfile_path(gem_name: tier2_name, version: tier2_version, ruby_series: ruby_series) : nil,
    -    x_std_libs_gemfile: File.join("gemfiles", "modular", "x_std_libs", ruby_series.to_s, "libs.gemfile"),
    -    ruby_series: ruby_series.to_s
    -  }
    +def gemfile_gem_call_records(content)
    +  ruby_call_records(content, :gem).filter_map do |call|
    +    name = ruby_string_argument(call)
    +    next unless name
    +
    +    {
    +      name: name,
    +      start_line: call.location.start_line,
    +      end_line: ruby_node_source_end_line(call)
    +    }
    +  end
     end
    +
    @@ -20389,58 +35896,29 @@

    -

    - - .appraisal_matrix_has_versions?(matrix) ⇒ Boolean +

    - + .gemfile_paragraphs(content) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -2440
    -2441
    -2442
    -2443
    -2444
    -2445
    -2446
    +4795 +4796 +4797 +4798 +4799 +4800 +4801 +4802 +4803
    -
    # File 'lib/kettle/jem.rb', line 2440
    +      
    # File 'lib/kettle/jem.rb', line 4795
     
    -def appraisal_matrix_fresh?(matrix, now: Time.now.to_i)
    -  resolved_at = (matrix || {})[:resolved_at] || (matrix || {})["resolved_at"]
    -  return false unless resolved_at
    +def gemfile_nomono_dependency_names(content)
    +  result = prism_parse_success(content)
    +  return [] unless result
     
    -  ttl = (matrix || {})[:freshness_ttl] || (matrix || {})["freshness_ttl"] || APPRAISAL_DEFAULT_FRESHNESS_TTL
    -  (now.to_i - resolved_at.to_i) < ttl.to_i
    +  word_arrays_by_local = ruby_local_word_array_assignments(result.value)
    +  ruby_call_records(content, :eval_nomono_gems).flat_map do |call|
    +    ruby_static_string_array_value(ruby_keyword_argument_node(call, :gems), word_arrays_by_local)
    +  end.uniq
     end
    +
    @@ -20448,9 +35926,9 @@

    -

    +

    - .appraisal_minor_key(version) ⇒ Object + .gemfile_percent_w_names(content) ⇒ Object @@ -20462,17 +35940,15 @@

     
     
    -2277
    -2278
    -2279
    -2280
    +6514 +6515 +6516

    @@ -20480,9 +35956,9 @@

    -

    +

    - .appraisal_minor_versions_by_major(versions) ⇒ Object + .gemfile_policy_operations(template_content, original, final, request) ⇒ Object @@ -20494,39 +35970,33 @@

     
     
    -2185
    -2186
    -2187
    -2188
    -2189
    -2190
    -2191
    -2192
    -2193
    -2194
    -2195
    -2196
    -2197
    -2198
    -2199
    +4690 +4691 +4692 +4693 +4694 +4695 +4696 +4697 +4698 +4699 +4700 +4701

    @@ -20534,65 +36004,58 @@

    -

    +

    - .appraisal_minor_versions_to_buckets(minor_versions) ⇒ Object + .gemfile_workspace_override_node?(node) ⇒ Boolean -

     
     
    -2433
    -2434
    -2435
    -2436
    -2437
    -2438
    +6510 +6511 +6512
    -
    # File 'lib/kettle/jem.rb', line 2433
    +      
    # File 'lib/kettle/jem.rb', line 6510
     
    -def appraisal_matrix_has_versions?(matrix)
    -  gems = deep_string_key_hash(matrix || {}).fetch("gems", {})
    -  %w[tier1 tier2].any? do |tier|
    -    Array(gems[tier]).any? { |gem_config| Array(gem_config["versions"]).any? }
    -  end
    +def gemfile_paragraphs(content)
    +  content.to_s.split(/\n{2,}/).map { |paragraph| ensure_trailing_newline(paragraph.strip) }.reject { |paragraph| paragraph.strip.empty? }
     end
    -
    # File 'lib/kettle/jem.rb', line 2277
    +      
    # File 'lib/kettle/jem.rb', line 6514
     
    -def appraisal_minor_key(version)
    -  segments = Gem::Version.new(version.to_s).segments
    -  "#{segments[0]}.#{segments[1] || 0}"
    +def gemfile_percent_w_names(content)
    +  ruby_word_array_records(content).flat_map { |record| record.fetch(:names) }.reject(&:empty?)
     end
    -
    # File 'lib/kettle/jem.rb', line 2185
    +      
    # File 'lib/kettle/jem.rb', line 4690
     
    -def appraisal_minor_versions_by_major(versions)
    -  versions.map do |version|
    -    gem_version = Gem::Version.new(version)
    -    segments = gem_version.segments
    -    {
    -      major: segments[0],
    -      minor: "#{segments[0]}.#{segments[1] || 0}"
    -    }
    -  end.uniq.group_by { |entry| entry.fetch(:major) }.map do |major, entries|
    +def gemfile_policy_operations(template_content, original, final, request)
    +  package_name = runtime_context_value(request, :package, :name).to_s
    +  deleted = gemfile_dependency_names("#{template_content}\n#{original}") - gemfile_dependency_names(final)
    +  expected = ["appraisal"]
    +  expected << package_name unless package_name.empty?
    +  [
         {
    -      major: major,
    -      minors: entries.map { |entry| entry.fetch(:minor) }.sort_by { |minor| Gem::Version.new(minor) }
    +      operation: "delete_dependency_declarations",
    +      deleted_gems: (deleted & expected).sort
         }
    -  end.sort_by { |entry| entry.fetch(:major) }
    +  ]
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -20600,9 +36063,9 @@

    -

    +

    - .appraisal_modular_gemfile_content(gem_name:, version:, sub_dependencies: {}) ⇒ Object + .gemspec_assignment_field(call) ⇒ Object @@ -20614,35 +36077,23 @@

     
     
    -1990
    -1991
    -1992
    -1993
    -1994
    -1995
    -1996
    -1997
    -1998
    -1999
    -2000
    -2001
    -2002
    +8633 +8634 +8635 +8636 +8637 +8638 +8639

    @@ -20650,9 +36101,9 @@

    -

    +

    - .appraisal_modular_gemfile_path(gem_name:, version:, ruby_series:) ⇒ Object + .gemspec_assignment_records(source, receiver: nil) ⇒ Object @@ -20664,15 +36115,47 @@

     
     
    -1986
    -1987
    -1988
    +8613 +8614 +8615 +8616 +8617 +8618 +8619 +8620 +8621 +8622 +8623 +8624 +8625 +8626 +8627 +8628 +8629 +8630 +8631

    @@ -20680,9 +36163,9 @@

    -

    +

    - .appraisal_name(tier1_gem:, tier1_version:, ruby_series:, tier2_gem: nil, tier2_version: nil) ⇒ Object + .gemspec_assignment_value(call) ⇒ Object @@ -20694,35 +36177,31 @@

     
     
    -1972
    -1973
    -1974
    -1975
    -1976
    -1977
    -1978
    -1979
    -1980
    -1981
    -1982
    -1983
    -1984
    +8641 +8642 +8643 +8644 +8645 +8646 +8647 +8648 +8649 +8650 +8651

    @@ -20730,9 +36209,9 @@

    -

    +

    - .appraisal_names(content) ⇒ Object + .gemspec_block_param(source) ⇒ Object @@ -20744,15 +36223,19 @@

     
     
    -4133
    -4134
    -4135
    +7663 +7664 +7665 +7666 +7667

    @@ -20760,9 +36243,9 @@

    -

    +

    - .appraisal_next_seam_ruby(version, min_ruby, all_versions, version_min_rubies) ⇒ Object + .gemspec_dependency_call_kind(call) ⇒ Object @@ -20774,31 +36257,21 @@

     
     
    -2310
    -2311
    -2312
    -2313
    -2314
    -2315
    -2316
    -2317
    -2318
    -2319
    -2320
    +8742 +8743 +8744 +8745 +8746 +8747

    @@ -20806,9 +36279,9 @@

    -

    +

    - .appraisal_normalized_bucket_ranges(bucket_ranges) ⇒ Object + .gemspec_dependency_from_record(record) ⇒ Object @@ -20820,25 +36293,15 @@

     
     
    -2287
    -2288
    -2289
    -2290
    -2291
    -2292
    -2293
    -2294
    +11167 +11168 +11169

    @@ -20846,58 +36309,67 @@

    -

    +

    - .appraisal_recording_enabled?(config) ⇒ Boolean + .gemspec_dependency_line_index(source, receiver:) ⇒ Object -

    -
    - +

     
     
    -2255
    -2256
    -2257
    -2258
    -2259
    -2260
    -2261
    -2262
    -2263
    -2264
    -2265
    -2266
    -2267
    -2268
    -2269
    -2270
    -2271
    -2272
    -2273
    -2274
    -2275
    +6095 +6096 +6097 +6098 +6099 +6100
    -
    # File 'lib/kettle/jem.rb', line 2255
    +      
    # File 'lib/kettle/jem.rb', line 6095
     
    -def appraisal_minor_versions_to_buckets(minor_versions)
    -  by_major = minor_versions.group_by { |minor| minor.split(".").first.to_i }
    -  buckets = []
    -  ranges = {}
    -  by_major.each do |major, minors|
    -    sorted = minors.sort_by { |minor| Gem::Version.new(minor) }
    -    sorted.each_with_index do |minor, index|
    -      bucket = (index == sorted.length - 1) ? "r#{major}" : "r#{major}.#{[sorted[index + 1].split(".").last.to_i - 1, minor.split(".").last.to_i].max}"
    -      next if ranges.key?(bucket)
    +def gemfile_workspace_override_node?(node)
    +  return false unless gemfile_conditional_node?(node)
    +  return false if prism_subtree_contains_string?(node, "K_JEM_TEMPLATING")
     
    -      buckets << bucket
    -      ceiling = if index == sorted.length - 1
    -        "#{major}.99"
    -      else
    -        bucket.split(".").last ? "#{major}.#{bucket.split(".").last}" : "#{major}.99"
    -      end
    -      ranges[bucket] = {floor: Gem::Version.new(minor), ceiling: Gem::Version.new(ceiling)}
    -    end
    -  end
    -  {buckets: buckets.sort_by { |bucket| appraisal_bucket_sort_key(bucket) }, bucket_ranges: ranges}
    +  prism_subtree_contains_call?(node, :eval_nomono_gems)
     end
    -
    # File 'lib/kettle/jem.rb', line 1990
    +      
    # File 'lib/kettle/jem.rb', line 8633
     
    -def appraisal_modular_gemfile_content(gem_name:, version:, sub_dependencies: {})
    -  lines = [
    -    "# frozen_string_literal: true",
    -    "",
    -    "# Generated by kettle-jem",
    -    "",
    -    %(gem "#{gem_name}", "#{appraisal_version_requirement(version)}")
    -  ]
    -  sub_dependencies.each do |name, requirement|
    -    lines << %(gem "#{name}", "~> #{requirement}")
    -  end
    -  ensure_trailing_newline(lines.join("\n"))
    +def gemspec_assignment_field(call)
    +  name = call.name.to_s
    +  return unless name.end_with?("=")
    +  return if name == "[]="
    +
    +  name.delete_suffix("=")
     end
    -
    # File 'lib/kettle/jem.rb', line 1986
    +      
    # File 'lib/kettle/jem.rb', line 8613
     
    -def appraisal_modular_gemfile_path(gem_name:, version:, ruby_series:)
    -  File.join("gemfiles", "modular", gem_name.to_s, ruby_series.to_s, "v#{version}.gemfile")
    +def gemspec_assignment_records(source, receiver: nil)
    +  lines = source.to_s.lines
    +  ruby_call_records(source, nil).filter_map do |call|
    +    field = gemspec_assignment_field(call)
    +    next unless field
    +    next if receiver && call.receiver&.slice != receiver.to_s
    +    end_line = ruby_node_source_end_line(call)
    +
    +    {
    +      field: field,
    +      value: gemspec_assignment_value(call),
    +      value_node: call.arguments&.arguments&.first,
    +      receiver: call.receiver&.slice,
    +      start_line: call.location.start_line,
    +      end_line: end_line,
    +      source: (lines[(call.location.start_line - 1)..(end_line - 1)] || []).join
    +    }
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 1972
    +      
    # File 'lib/kettle/jem.rb', line 8641
     
    -def appraisal_name(tier1_gem:, tier1_version:, ruby_series:, tier2_gem: nil, tier2_version: nil)
    -  parts = [
    -    APPRAISAL_NAME_PREFIX,
    -    appraisal_gem_abbreviation(tier1_gem),
    -    appraisal_format_version(tier1_version)
    -  ]
    -  unless tier2_gem.to_s.empty?
    -    parts << appraisal_gem_abbreviation(tier2_gem)
    -    parts << appraisal_format_version(tier2_version)
    +def gemspec_assignment_value(call)
    +  argument = call.arguments&.arguments&.first
    +  case argument
    +  when ::Prism::StringNode, ::Prism::InterpolatedStringNode, ::Prism::CallNode
    +    ruby_static_string_value(argument) || argument&.slice
    +  when ::Prism::ArrayNode
    +    argument.elements.filter_map { |element| ruby_static_string_value(element) }
    +  else
    +    argument&.slice
       end
    -  parts << ruby_series.to_s
    -  parts.join("-")
     end
    -
    # File 'lib/kettle/jem.rb', line 4133
    +      
    # File 'lib/kettle/jem.rb', line 7663
     
    -def appraisal_names(content)
    -  appraisal_call_records(content).map { |record| record.fetch(:name) }
    +def gemspec_block_param(source)
    +  call = gemspec_new_call(source)
    +  required = call&.block&.parameters&.parameters&.requireds&.first
    +  required&.name&.to_s
     end
    -
    # File 'lib/kettle/jem.rb', line 2310
    -
    -def appraisal_next_seam_ruby(version, min_ruby, all_versions, version_min_rubies)
    -  found = false
    -  all_versions.sort_by { |candidate| Gem::Version.new(candidate) }.each do |candidate|
    -    found ||= Gem::Version.new(candidate) >= Gem::Version.new(version)
    -    next unless found
    +      
    # File 'lib/kettle/jem.rb', line 8742
     
    -    candidate_ruby = version_min_rubies[candidate]
    -    return candidate_ruby if candidate_ruby && candidate_ruby > min_ruby
    +def gemspec_dependency_call_kind(call)
    +  case call.name
    +  when :add_dependency, :add_runtime_dependency, :add_development_dependency
    +    call.name.to_s
       end
    -  nil
     end
    -
    # File 'lib/kettle/jem.rb', line 2287
    +      
    # File 'lib/kettle/jem.rb', line 11167
     
    -def appraisal_normalized_bucket_ranges(bucket_ranges)
    -  bucket_ranges.transform_values do |range|
    -    {
    -      floor: Gem::Version.new((range[:floor] || range["floor"]).to_s),
    -      ceiling: Gem::Version.new((range[:ceiling] || range["ceiling"]).to_s)
    -    }
    -  end
    +def gemspec_dependency_from_record(record)
    +  Gem::Dependency.new(record.fetch(:name), *record.fetch(:requirements), (record.fetch(:kind) == "add_development_dependency") ? :development : :runtime)
     end
    + + + + +
    +
     
     
    -  
    +8550
    +8551
    +8552
    +8553
    +8554
    +8555
    +
    +
    # File 'lib/kettle/jem.rb', line 8550
    +
    +def gemspec_dependency_line_index(source, receiver:)
    +  gemspec_dependency_records(source, receiver: receiver).each_with_object({}) do |record, dependencies|
    +    key = gemspec_dependency_record_key(record)
    +    dependencies[key] ||= record.fetch(:source)
    +  end
    +end
    +
    -
    + +
    +

    -

    Returns:

    -
      + .gemspec_dependency_line_key(line, receiver:) ⇒ Object -
    • - - - (Boolean) - - - -
    • + -
    -

    + +
    @@ -20905,9 +36377,9 @@

    -

    +

    - .appraisal_resolve_sub_dependencies(parent_gem:, parent_version:, parent_versions:, dependency_versions:, ruby_min: nil, excluded_gems: []) ⇒ Object + .gemspec_dependency_minimum_requirement_replacement(call, requirement) ⇒ Object @@ -20919,54 +36391,62 @@

     
     
    -2350
    -2351
    -2352
    -2353
    -2354
    -2355
    -2356
    -2357
    -2358
    -2359
    -2360
    -2361
    -2362
    -2363
    -2364
    -2365
    -2366
    -2367
    -2368
    -2369
    -2370
    -2371
    -2372
    +8322 +8323 +8324 +8325 +8326 +8327 +8328 +8329 +8330 +8331 +8332 +8333 +8334 +8335 +8336 +8337 +8338 +8339 +8340 +8341 +8342 +8343 +8344 +8345 +8346 +8347 +8348

    @@ -20975,9 +36455,9 @@

    -

    +

    - .appraisal_ruby_series(version_metadata, project_min_ruby: nil) ⇒ Object + .gemspec_dependency_names(source) ⇒ Object @@ -20989,29 +36469,15 @@

     
     
    -2216
    -2217
    -2218
    -2219
    -2220
    -2221
    -2222
    -2223
    -2224
    -2225
    +8557 +8558 +8559

    @@ -21019,9 +36485,9 @@

    -

    +

    - .appraisal_ruby_version(value) ⇒ Object + .gemspec_dependency_record_key(record) ⇒ Object @@ -21033,29 +36499,15 @@

     
     
    -5056
    -5057
    -5058
    -5059
    -5060
    -5061
    -5062
    -5063
    -5064
    -5065
    +8587 +8588 +8589

    @@ -21063,9 +36515,9 @@

    -

    +

    - .appraisal_scaffold_config(gemspec_content:, existing_config: {}, exclusions: [], default_mode: "semver", freshness_ttl: APPRAISAL_DEFAULT_FRESHNESS_TTL) ⇒ Object + .gemspec_dependency_record_version(record) ⇒ Object @@ -21077,41 +36529,25 @@

     
     
    -2416
    -2417
    -2418
    -2419
    -2420
    -2421
    -2422
    -2423
    -2424
    -2425
    -2426
    -2427
    -2428
    -2429
    -2430
    -2431
    +8604 +8605 +8606 +8607 +8608 +8609 +8610 +8611

    @@ -21119,9 +36555,9 @@

    -

    +

    - .appraisal_select_dependency_version(version_metadata, requirement:, ruby_min:) ⇒ Object + .gemspec_dependency_records(source, receiver: nil) ⇒ Object @@ -21133,41 +36569,53 @@

     
     
    -2382
    -2383
    -2384
    -2385
    -2386
    -2387
    -2388
    -2389
    -2390
    -2391
    -2392
    -2393
    -2394
    -2395
    -2396
    -2397
    +8719 +8720 +8721 +8722 +8723 +8724 +8725 +8726 +8727 +8728 +8729 +8730 +8731 +8732 +8733 +8734 +8735 +8736 +8737 +8738 +8739 +8740

    @@ -21175,9 +36623,9 @@

    -

    +

    - .appraisal_select_versions(version_metadata, mode:, requirements: nil) ⇒ Object + .gemspec_dependency_requirements_satisfy_floor?(requirements, floor_requirement) ⇒ Boolean @@ -21192,13 +36640,13 @@

    -

    Raises:

    -
      +

      Returns:

      +
      • - (ArgumentError) + (Boolean) @@ -21212,62 +36660,30 @@

         
         
        -2096
        -2097
        -2098
        -2099
        -2100
        -2101
        -2102
        -2103
        -2104
        -2105
        -2106
        -2107
        -2108
        -2109
        -2110
        -2111
        -2112
        -2113
        -2114
        -2115
        -2116
        -2117
        -2118
        -2119
        -2120
        -2121
        -2122
        +8310 +8311 +8312 +8313 +8314 +8315 +8316 +8317 +8318 +8319 +8320

    @@ -21276,71 +36692,57 @@

    -

    +

    - .appraisal_sort_versions(values) ⇒ Object + .gemspec_dependency_section_heading_comment?(stripped_line) ⇒ Boolean -

     
     
    -10841
    -10842
    -10843
    -10844
    -10845
    -10846
    +8582 +8583 +8584 +8585
    -
    # File 'lib/kettle/jem.rb', line 10841
    -
    -def appraisal_recording_enabled?(config)
    -  workflows = config["workflows"]
    -  workflows = {} unless workflows.is_a?(Hash)
    +      
    # File 'lib/kettle/jem.rb', line 8582
     
    -  DecisionPolicy.value_to_boolean(workflows["recording"]) == true
    +def gemspec_dependency_line_key(line, receiver:)
    +  record = gemspec_dependency_records(line, receiver: receiver).first
    +  gemspec_dependency_record_key(record) if record
     end
    -
    # File 'lib/kettle/jem.rb', line 2350
    -
    -def appraisal_resolve_sub_dependencies(parent_gem:, parent_version:, parent_versions:, dependency_versions:, ruby_min: nil, excluded_gems: [])
    -  parent = appraisal_latest_version_matching(parent_versions, parent_version)
    -  return {} unless parent
    +      
    # File 'lib/kettle/jem.rb', line 8322
     
    -  ruby_floor = Gem::Version.new(ruby_min.to_s) unless ruby_min.to_s.empty?
    -  excluded = excluded_gems.map(&:to_s)
    -  Array(parent[:runtime_dependencies] || parent["runtime_dependencies"]).each_with_object({}) do |dependency, resolved|
    -    name = (dependency[:name] || dependency["name"]).to_s
    -    next if name.empty? || excluded.include?(name)
    +def gemspec_dependency_minimum_requirement_replacement(call, requirement)
    +  arguments = Array(call.arguments&.arguments)
    +  floor = Gem::Requirement.new(requirement).requirements.first.last
    +  existing_floor = arguments.drop(1).find do |argument|
    +    value = ruby_static_string_value(argument)
    +    next false unless value
     
    -    requirement = begin
    -      Gem::Requirement.new(dependency[:requirements] || dependency["requirements"] || ">= 0")
    -    rescue ArgumentError
    -      Gem::Requirement.default
    -    end
    -    selected = appraisal_select_dependency_version(
    -      Array(dependency_versions[name] || dependency_versions[name.to_sym]),
    -      requirement: requirement,
    -      ruby_min: ruby_floor
    -    )
    -    resolved[name] = selected if selected
    +    parsed = Gem::Requirement.new(value).requirements
    +    parsed.any? { |operator, version| %w[>= > =].include?(operator.to_s) && version < floor }
    +  rescue ArgumentError
    +    false
    +  end
    +  if existing_floor
    +    {
    +      start_offset: existing_floor.location.start_offset,
    +      end_offset: existing_floor.location.end_offset,
    +      replacement: JSON.generate(requirement)
    +    }
    +  else
    +    insertion_offset = arguments.last.location.end_offset
    +    {
    +      start_offset: insertion_offset,
    +      end_offset: insertion_offset,
    +      replacement: ", #{JSON.generate(requirement)}"
    +    }
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 2216
    +      
    # File 'lib/kettle/jem.rb', line 8557
     
    -def appraisal_ruby_series(, project_min_ruby: nil)
    -  floors = appraisal_find_ruby_seams().map { |seam| seam.fetch(:min_ruby) }
    -  if project_min_ruby
    -    floor = Gem::Version.new(project_min_ruby.to_s)
    -    floors.reject! { |version| version < floor }
    -    floors << floor unless floors.include?(floor)
    -  end
    -  floors = [Gem::Version.new("3.2")] if floors.empty?
    -  appraisal_minor_versions_to_buckets(floors.map { |version| appraisal_minor_key(version) }.uniq.sort)
    +def gemspec_dependency_names(source)
    +  gemspec_dependency_records(source).map { |record| record.fetch(:name) }
     end
    -
    # File 'lib/kettle/jem.rb', line 5056
    -
    -def appraisal_ruby_version(value)
    -  parts = value.to_s.split("-")
    -  return unless parts.length == 3 && parts.first == "ruby"
    -
    -  major = Integer(parts[1], exception: false)
    -  minor = Integer(parts[2], exception: false)
    -  return unless major && minor
    +      
    # File 'lib/kettle/jem.rb', line 8587
     
    -  "#{major}.#{minor}"
    +def gemspec_dependency_record_key(record)
    +  [record.fetch(:kind), record.fetch(:name)]
     end
    -
    # File 'lib/kettle/jem.rb', line 2416
    -
    -def appraisal_scaffold_config(gemspec_content:, existing_config: {}, exclusions: [], default_mode: "semver", freshness_ttl: APPRAISAL_DEFAULT_FRESHNESS_TTL)
    -  excluded = exclusions.map(&:to_s).to_set
    -  runtime_dependencies = appraisal_extract_runtime_dependencies(gemspec_content)
    -  tier1 = runtime_dependencies.reject { |name| excluded.include?(name) }.map { |name| {"name" => name} }
    -  config = deep_string_key_hash(existing_config)
    -  matrix = config["appraisal_matrix"] || {}
    -  gems = matrix["gems"] || {}
    +      
    # File 'lib/kettle/jem.rb', line 8604
     
    -  matrix["mode"] ||= default_mode
    -  matrix["freshness_ttl"] ||= freshness_ttl
    -  gems["tier1"] = tier1
    -  gems["tier2"] ||= []
    -  matrix["gems"] = gems
    -  config["appraisal_matrix"] = matrix
    -  config
    +def gemspec_dependency_record_version(record)
    +  versions = record.fetch(:requirements, []).filter_map do |requirement|
    +    Gem::Requirement.new(requirement.to_s).requirements.map(&:last)
    +  rescue ArgumentError
    +    nil
    +  end.flatten
    +  versions.max || Gem::Version.new("0")
     end
    -
    # File 'lib/kettle/jem.rb', line 2382
    +      
    # File 'lib/kettle/jem.rb', line 8719
     
    -def appraisal_select_dependency_version(, requirement:, ruby_min:)
    -  compatible = .select do |entry|
    -    number = (entry[:number] || entry["number"]).to_s
    -    !number.empty? && requirement.satisfied_by?(Gem::Version.new(number))
    -  end.sort_by { |entry| Gem::Version.new((entry[:number] || entry["number"]).to_s) }
    -  return if compatible.empty?
    +def gemspec_dependency_records(source, receiver: nil)
    +  lines = source.to_s.lines
    +  ruby_call_records(source, nil).filter_map do |call|
    +    kind = gemspec_dependency_call_kind(call)
    +    next unless kind
    +    next if receiver && call.receiver&.slice != receiver.to_s
     
    -  if ruby_min
    -    selected = compatible.reverse.find do |entry|
    -      min_ruby = entry[:min_ruby] || entry["min_ruby"]
    -      min_ruby.to_s.empty? || Gem::Version.new(min_ruby.to_s) <= ruby_min
    -    end
    -    return (selected || compatible.first).then { |entry| entry[:number] || entry["number"] }
    +    name = ruby_string_argument(call)
    +    next unless name
    +
    +    {
    +      kind: kind,
    +      name: name,
    +      requirement: ruby_string_argument_at(call, 1),
    +      requirements: ruby_string_arguments(call).drop(1),
    +      receiver: call.receiver&.slice,
    +      start_line: call.location.start_line,
    +      end_line: ruby_node_source_end_line(call),
    +      source: (lines[(call.location.start_line - 1)..(ruby_node_source_end_line(call) - 1)] || []).join
    +    }
       end
    -  compatible.last.then { |entry| entry[:number] || entry["number"] }
     end
    -
    # File 'lib/kettle/jem.rb', line 2096
    -
    -def appraisal_select_versions(, mode:, requirements: nil)
    -  mode = mode.to_s
    -  raise ArgumentError, "invalid appraisal version selection mode: #{mode}" unless APPRAISAL_VERSION_SELECTION_MODES.include?(mode)
    -
    -  versions = appraisal_filtered_versions(, requirements: requirements)
    -  return versions if mode == "patch"
    -
    -  by_major = appraisal_minor_versions_by_major(versions)
    -  return [] if by_major.empty?
    +      
    # File 'lib/kettle/jem.rb', line 8310
     
    -  current_major = by_major.last.fetch(:major)
    -  case mode
    -  when "major"
    -    by_major.map { |entry| entry.fetch(:minors).last }
    -  when "minor"
    -    by_major.flat_map { |entry| entry.fetch(:minors) }
    -  when "minor-minmax"
    -    by_major.flat_map do |entry|
    -      minors = entry.fetch(:minors)
    -      (entry.fetch(:major) < current_major) ? [minors.first, minors.last].uniq : minors
    -    end
    -  when "semver"
    -    by_major.flat_map do |entry|
    -      (entry.fetch(:major) < current_major) ? [entry.fetch(:minors).last] : entry.fetch(:minors)
    +def gemspec_dependency_requirements_satisfy_floor?(requirements, floor_requirement)
    +  floor = Gem::Requirement.new(floor_requirement).requirements.first.last
    +  requirements.any? do |requirement|
    +    parsed = Gem::Requirement.new(requirement.to_s).requirements
    +    parsed.any? do |operator, version|
    +      %w[>= > =].include?(operator.to_s) && version >= floor
         end
    +  rescue ArgumentError
    +    false
       end
     end
    - - - - -
    -
    -
    +
    +
    +

    Prism does not expose comments as normal AST statements, so dependency-section
    +headings are bounded to single-line comments after the gemspec development note.

    -2500 -2501 -2502
    -
    -
    # File 'lib/kettle/jem.rb', line 2500
     
    -def appraisal_sort_versions(values)
    -  values.compact.map(&:to_s).reject(&:empty?).uniq.sort_by { |version| Gem::Version.new(version) }
    -end
    -
    +
    - -
    -

    +
    - .appraisal_stale_gemfile_paths(existing_paths:, current_entries:) ⇒ Object +

    Returns:

    +
      - +
    • + + + (Boolean) + + + +
    • +
    - -

    +
    @@ -21348,9 +36750,9 @@

    -

    +

    - .appraisal_time_ago(timestamp, now: Time.now.to_i) ⇒ Object + .gemspec_dependency_sort_key(name) ⇒ Object @@ -21362,27 +36764,15 @@

     
     
    -2448
    -2449
    -2450
    -2451
    -2452
    -2453
    -2454
    -2455
    -2456
    +8397 +8398 +8399

    @@ -21390,81 +36780,60 @@

    -

    +

    - .appraisal_version_min_ruby_map(all_versions, seams) ⇒ Object + .gemspec_dependency_source_newer?(candidate_source, current_source, receiver:) ⇒ Boolean -

     
     
    -2399
    -2400
    -2401
    -2402
    -2403
    -2404
    -2405
    -2406
    -2407
    +8430 +8431 +8432 +8433 +8434
    -
    # File 'lib/kettle/jem.rb', line 2399
    +      
    # File 'lib/kettle/jem.rb', line 8430
     
    -def appraisal_stale_gemfile_paths(existing_paths:, current_entries:)
    -  current_names = current_entries.map { |entry| (entry[:name] || entry["name"]).to_s }.to_set
    -  existing_paths.map(&:to_s).select do |path|
    -    basename = File.basename(path, ".gemfile")
    -    path.start_with?("gemfiles/#{APPRAISAL_NAME_PREFIX}-") &&
    -      path.end_with?(".gemfile") &&
    -      !current_names.include?(basename)
    -  end.sort
    +def gemspec_dependency_section_heading_comment?(stripped_line)
    +  stripped_line.start_with?("# ") &&
    +    !stripped_line.start_with?("# NOTE:") &&
    +    !stripped_line.start_with?("#       ")
     end
    -
    # File 'lib/kettle/jem.rb', line 2448
    +      
    # File 'lib/kettle/jem.rb', line 8397
     
    -def appraisal_time_ago(timestamp, now: Time.now.to_i)
    -  return "unknown" unless timestamp
    -
    -  seconds = now.to_i - timestamp.to_i
    -  return "#{seconds / 60}m" if seconds < 3600
    -  return "#{seconds / 3600}h" if seconds < 86_400
    -
    -  "#{seconds / 86_400}d"
    +def gemspec_dependency_sort_key(name)
    +  name.to_s.tr("_", "-")
     end
    - - - - -
    -
    -
    +
    +
    + -2296 -2297 -2298 -2299 -2300 -2301 -2302 -2303 -2304 -2305 -2306 -2307 -2308
    -
    -
    # File 'lib/kettle/jem.rb', line 2296
     
    -def appraisal_version_min_ruby_map(all_versions, seams)
    -  sorted_seams = seams.sort_by { |seam| Gem::Version.new(seam[:version] || seam["version"]) }
    -  seam_index = 0
    -  current = nil
    -  all_versions.sort_by { |version| Gem::Version.new(version) }.each_with_object({}) do |version, map|
    -    while seam_index < sorted_seams.length && Gem::Version.new(sorted_seams[seam_index][:version] || sorted_seams[seam_index]["version"]) <= Gem::Version.new(version)
    -      current = Gem::Version.new((sorted_seams[seam_index][:min_ruby] || sorted_seams[seam_index]["min_ruby"]).to_s)
    -      current = [current, DEFAULT_TEST_MINIMUM_RUBY].max
    -      seam_index += 1
    -    end
    -    map[version] = current if current
    -  end
    -end
    -
    +
    - -
    -

    +
    - .appraisal_version_requirement(version) ⇒ Object +

    Returns:

    +
      - +
    • + + + (Boolean) + + + +
    • +
    - -

    +
    @@ -21472,9 +36841,9 @@

    -

    +

    - .appraisal_workflow_groups(matrix_entries, bucket_ranges:, exec_cmd: "kettle-test") ⇒ Object + .gemspec_end_line(source) ⇒ Object @@ -21486,57 +36855,15 @@

     
     
    -2033
    -2034
    -2035
    -2036
    -2037
    -2038
    -2039
    -2040
    -2041
    -2042
    -2043
    -2044
    -2045
    -2046
    -2047
    -2048
    -2049
    -2050
    -2051
    -2052
    -2053
    -2054
    -2055
    -2056
    +8753 +8754 +8755

    @@ -21544,9 +36871,9 @@

    -

    +

    - .appraisal_workflow_lifecycle(ruby_floor) ⇒ Object + .gemspec_field_receiver_and_name(field) ⇒ Object @@ -21558,21 +36885,21 @@

     
     
    -2072
    -2073
    -2074
    -2075
    -2076
    -2077
    +8673 +8674 +8675 +8676 +8677 +8678

    @@ -21580,9 +36907,9 @@

    -

    +

    - .appraisal_workflow_ruby(ruby_floor, lifecycle) ⇒ Object + .gemspec_files_array_collection_source(target_parts, groups) ⇒ Object @@ -21594,21 +36921,23 @@

     
     
    -2079
    -2080
    -2081
    -2082
    -2083
    -2084
    +7839 +7840 +7841 +7842 +7843 +7844 +7845

    @@ -21616,9 +36945,9 @@

    -

    +

    - .appraisal_workflow_yaml_snippets(matrix_entries, bucket_ranges:, exec_cmd: "kettle-test") ⇒ Object + .gemspec_files_child_collection_record(record, value_node) ⇒ Object @@ -21630,35 +36959,39 @@

     
     
    -2058
    -2059
    -2060
    -2061
    -2062
    -2063
    -2064
    -2065
    -2066
    -2067
    -2068
    -2069
    -2070
    +7976 +7977 +7978 +7979 +7980 +7981 +7982 +7983 +7984 +7985 +7986 +7987 +7988 +7989 +7990

    @@ -21666,9 +36999,9 @@

    -

    +

    - .appraisal_x_stdlib_eval_gemfile_call(block) ⇒ Object + .gemspec_files_collection_body_source(groups) ⇒ Object @@ -21680,19 +37013,19 @@

     
     
    -5655
    -5656
    -5657
    -5658
    -5659
    +7847 +7848 +7849 +7850 +7851

    @@ -21700,9 +37033,9 @@

    -

    +

    - .appraisal_x_stdlib_exclusions(template_content) ⇒ Object + .gemspec_files_collection_element_nodes(value_node) ⇒ Object @@ -21714,27 +37047,25 @@

     
     
    -2086
    -2087
    -2088
    -2089
    -2090
    -2091
    -2092
    -2093
    -2094
    +7999 +8000 +8001 +8002 +8003 +8004 +8005 +8006

    @@ -21742,9 +37073,9 @@

    -

    +

    - .appraisals_policy_operations(template_content, original, final, request) ⇒ Object + .gemspec_files_collection_entry_key(node) ⇒ Object @@ -21756,51 +37087,21 @@

     
     
    -4041
    -4042
    -4043
    -4044
    -4045
    -4046
    -4047
    -4048
    -4049
    -4050
    -4051
    -4052
    -4053
    -4054
    -4055
    -4056
    -4057
    -4058
    -4059
    -4060
    -4061
    +8069 +8070 +8071 +8072 +8073 +8074

    @@ -21808,65 +37109,54 @@

    -

    +

    - .author_facts(config, env, gemspec_metadata: {}, copyright: {}) ⇒ Object + .gemspec_files_collection_entry_node?(node) ⇒ Boolean -

     
     
    -2004
    -2005
    -2006
    -2007
    +8596 +8597 +8598 +8599 +8600 +8601 +8602
    -
    # File 'lib/kettle/jem.rb', line 2004
    +      
    # File 'lib/kettle/jem.rb', line 8596
     
    -def appraisal_version_requirement(version)
    -  segments = version.to_s.split(".")
    -  (segments.length >= 3) ? "~> #{version}" : "~> #{version}.0"
    +def gemspec_dependency_source_newer?(candidate_source, current_source, receiver:)
    +  candidate = gemspec_dependency_records(candidate_source, receiver: receiver).first
    +  current = gemspec_dependency_records(current_source, receiver: receiver).first
    +  return false unless candidate && current
    +
    +  gemspec_dependency_record_version(candidate) > gemspec_dependency_record_version(current)
     end
    -
    # File 'lib/kettle/jem.rb', line 2033
    -
    -def appraisal_workflow_groups(matrix_entries, bucket_ranges:, exec_cmd: "kettle-test")
    -  grouped = Hash.new { |hash, key| hash[key] = [] }
    -  normalized_ranges = bucket_ranges.transform_values do |range|
    -    {
    -      floor: Gem::Version.new((range[:floor] || range["floor"]).to_s),
    -      ceiling: Gem::Version.new((range[:ceiling] || range["ceiling"]).to_s)
    -    }
    -  end
    -  matrix_entries.each do |entry|
    -    ruby_series = entry[:ruby_series] || entry["ruby_series"]
    -    range = normalized_ranges[ruby_series]
    -    next unless range
    +      
    # File 'lib/kettle/jem.rb', line 8753
     
    -    lifecycle = appraisal_workflow_lifecycle(range.fetch(:floor))
    -    grouped[lifecycle] << {
    -      ruby: appraisal_workflow_ruby(range.fetch(:floor), lifecycle),
    -      appraisal: entry[:name] || entry["name"],
    -      exec_cmd: exec_cmd,
    -      rubygems: "latest",
    -      bundler: "latest"
    -    }
    -  end
    -  grouped.transform_values { |entries| entries.sort_by { |entry| entry.fetch(:appraisal).to_s } }
    +def gemspec_end_line(source)
    +  gemspec_new_call(source)&.location&.end_line || source.to_s.lines.length + 1
     end
    -
    # File 'lib/kettle/jem.rb', line 2072
    +      
    # File 'lib/kettle/jem.rb', line 8673
     
    -def appraisal_workflow_lifecycle(ruby_floor)
    -  APPRAISAL_WORKFLOW_LIFECYCLE_RANGES.each do |name, range|
    -    return name if ruby_floor.between?(range.fetch(:min), range.fetch(:max))
    -  end
    -  (ruby_floor < APPRAISAL_WORKFLOW_LIFECYCLE_RANGES.fetch("ancient").fetch(:min)) ? "ancient" : "current"
    +def gemspec_field_receiver_and_name(field)
    +  parts = field.to_s.split(".")
    +  return [nil, field.to_s] if parts.length == 1
    +
    +  [parts[0...-1].join("."), parts.last]
     end
    -
    # File 'lib/kettle/jem.rb', line 2079
    +      
    # File 'lib/kettle/jem.rb', line 7839
     
    -def appraisal_workflow_ruby(ruby_floor, lifecycle)
    -  return "ruby" if lifecycle == "current"
    -
    -  segments = ruby_floor.segments
    -  "#{segments[0]}.#{segments[1] || 0}"
    +def gemspec_files_array_collection_source(target_parts, groups)
    +  [
    +    target_parts.fetch(:opening),
    +    gemspec_files_collection_body_source(groups),
    +    target_parts.fetch(:closing)
    +  ].join
     end
    -
    # File 'lib/kettle/jem.rb', line 2058
    +      
    # File 'lib/kettle/jem.rb', line 7976
     
    -def appraisal_workflow_yaml_snippets(matrix_entries, bucket_ranges:, exec_cmd: "kettle-test")
    -  appraisal_workflow_groups(matrix_entries, bucket_ranges: bucket_ranges, exec_cmd: exec_cmd).transform_values do |entries|
    -    lines = ["strategy:", "  matrix:", "    include:"]
    -    entries.each do |entry|
    -      lines << %(      - ruby: "#{entry.fetch(:ruby)}")
    -      lines << %(        appraisal: "#{entry.fetch(:appraisal)}")
    -      lines << %(        exec_cmd: "#{entry.fetch(:exec_cmd)}")
    -      lines << %(        rubygems: "#{entry.fetch(:rubygems)}")
    -      lines << %(        bundler: "#{entry.fetch(:bundler)}")
    -    end
    -    lines.join("\n")
    -  end
    +def gemspec_files_child_collection_record(record, value_node)
    +  source_start_line = record.fetch(:start_line)
    +  lines = record.fetch(:source).lines
    +  start_index = value_node.location.start_line - source_start_line
    +  end_index = value_node.location.end_line - source_start_line
    +  child_lines = lines[start_index..end_index]
    +  return unless child_lines
    +
    +  record.merge(
    +    value_node: value_node,
    +    start_line: value_node.location.start_line,
    +    end_line: value_node.location.end_line,
    +    source: child_lines.join
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 5655
    +      
    # File 'lib/kettle/jem.rb', line 7847
     
    -def appraisal_x_stdlib_eval_gemfile_call(block)
    -  ruby_call_records(block, :eval_gemfile).find do |call|
    -    ruby_string_argument(call).to_s.start_with?("modular/x_std_libs")
    -  end
    +def gemspec_files_collection_body_source(groups)
    +  groups.each_with_index.map do |group, index|
    +    gemspec_files_collection_group_source(group, trailing_comma: index < groups.length - 1)
    +  end.join
     end
    -
    # File 'lib/kettle/jem.rb', line 2086
    -
    -def appraisal_x_stdlib_exclusions(template_content)
    -  gems = ruby_call_records(template_content, :eval_gemfile).filter_map do |call|
    -    path = ruby_string_argument(call).to_s
    -    next unless path.start_with?("../")
    +      
    # File 'lib/kettle/jem.rb', line 7999
     
    -    path.delete_prefix("../").split("/").first
    +def gemspec_files_collection_element_nodes(value_node)
    +  if gemspec_files_dir_call_node?(value_node)
    +    return Array(value_node.arguments&.arguments)
       end
    -  (gems + APPRAISAL_ALWAYS_EXCLUDED_GEMS).uniq.sort
    +  return value_node.elements if value_node.is_a?(::Prism::ArrayNode)
    +
    +  nil
     end
    -
    # File 'lib/kettle/jem.rb', line 4041
    +      
    # File 'lib/kettle/jem.rb', line 8069
     
    -def appraisals_policy_operations(template_content, original, final, request)
    -  package_name = runtime_context_value(request, :package, :name).to_s
    -  min_ruby = minimum_ruby_token(runtime_context_value(request, :ci, :test_min_ruby) || runtime_context_value(request, :rubygems, :min_ruby))
    -  source = "#{template_content}\n#{original}"
    -  [
    -    {
    -      operation: "merge_appraisal_blocks",
    -      inserted_appraisals: (appraisal_names(template_content) - appraisal_names(original)).sort,
    -      preserved_destination_appraisals: (appraisal_names(original) - appraisal_names(template_content) & appraisal_names(final)).sort
    -    },
    -    {
    -      operation: "delete_self_dependency_declarations",
    -      deleted_dependency_count: [gemfile_dependency_names(source).count(package_name) - gemfile_dependency_names(final).count(package_name), 0].max
    -    },
    -    {
    -      operation: "prune_minimum_ruby_appraisals",
    -      min_ruby: min_ruby,
    -      deleted_appraisals: (ruby_appraisal_names_below(original, min_ruby) - appraisal_names(final)).sort
    -    }
    -  ]
    +def gemspec_files_collection_entry_key(node)
    +  return [:string, node.unescaped] if node.is_a?(::Prism::StringNode)
    +  return [:splat, gemspec_files_splat_expression_key(node.expression)] if node.is_a?(::Prism::SplatNode)
    +
    +  [:source, node.slice]
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -21874,9 +37164,9 @@

    -

    +

    - .author_family_names(name) ⇒ Object + .gemspec_files_collection_group_source(group, trailing_comma:) ⇒ Object @@ -21888,21 +37178,37 @@

     
     
    -9792
    -9793
    -9794
    -9795
    -9796
    -9797
    +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866

    @@ -21910,9 +37216,9 @@

    -

    +

    - .author_given_names(name) ⇒ Object + .gemspec_files_collection_groups(record:, element_nodes:, lines:) ⇒ Object @@ -21924,21 +37230,81 @@

     
     
    -9785
    -9786
    -9787
    -9788
    -9789
    -9790
    +8027 +8028 +8029 +8030 +8031 +8032 +8033 +8034 +8035 +8036 +8037 +8038 +8039 +8040 +8041 +8042 +8043 +8044 +8045 +8046 +8047 +8048 +8049 +8050 +8051 +8052 +8053 +8054 +8055 +8056 +8057 +8058 +8059 +8060 +8061 +8062

    @@ -21946,37 +37312,58 @@

    -

    +

    - .author_names(gemspec_metadata, copyright, primary_name) ⇒ Object + .gemspec_files_collection_has_nonliteral_entries?(parts) ⇒ Boolean -

     
     
    -8167
    -8168
    -8169
    -8170
    -8171
    -8172
    -8173
    -8174
    -8175
    -8176
    -8177
    -8178
    -8179
    -8180
    -8181
    -8182
    -8183
    -8184
    -8185
    -8186
    -8187
    +8064 +8065 +8066 +8067
    -
    # File 'lib/kettle/jem.rb', line 8167
    +      
    # File 'lib/kettle/jem.rb', line 8064
     
    -def author_facts(config, env, gemspec_metadata: {}, copyright: {})
    -  token_config = token_config_values(config)
    -  author_config = token_config["author"].is_a?(Hash) ? token_config["author"] : {}
    -  derived_name = Array([:authors]).map(&:to_s).find { |value| present_template_token_value?(value) }
    -  derived_email = Array([:email]).map(&:to_s).find { |value| present_template_token_value?(value) }
    -  name = preferred_template_token_value(derived_name, author_config["name"], env, "KJ_AUTHOR_NAME").to_s
    -  email = preferred_template_token_value(derived_email, author_config["email"], env, "KJ_AUTHOR_EMAIL").to_s
    -  given_names = preferred_template_token_value(author_given_names(name), author_config["given_names"], env, "KJ_AUTHOR_GIVEN_NAMES")
    -  family_names = preferred_template_token_value(author_family_names(name), author_config["family_names"], env, "KJ_AUTHOR_FAMILY_NAMES")
    -  domain = preferred_template_token_value(email.split("@", 2)[1], author_config["domain"], env, "KJ_AUTHOR_DOMAIN")
    -  orcid = preferred_template_token_value(nil, author_config["orcid"], env, "KJ_AUTHOR_ORCID")
    -  compact_hash(
    -    name: name,
    -    names: author_names(, copyright, name),
    -    given_names: given_names.to_s,
    -    family_names: family_names.to_s,
    -    email: email,
    -    domain: domain.to_s,
    -    orcid: orcid.to_s
    -  )
    +def gemspec_files_collection_entry_node?(node)
    +  node.location.start_line == node.location.end_line &&
    +    (node.is_a?(::Prism::StringNode) || node.is_a?(::Prism::SplatNode))
     end
    -
    # File 'lib/kettle/jem.rb', line 9792
    +      
    # File 'lib/kettle/jem.rb', line 7853
     
    -def author_family_names(name)
    -  parts = name.to_s.strip.split(/\s+/)
    -  return "" if parts.size < 2
    +def gemspec_files_collection_group_source(group, trailing_comma:)
    +  lines = group.fetch(:lines).dup
    +  return lines.join unless trailing_comma
     
    -  parts[-1]
    +  entry_index = lines.rindex { |line| !line.strip.empty? && !line.lstrip.start_with?("#") }
    +  return lines.join unless entry_index
    +
    +  line = lines.fetch(entry_index)
    +  return lines.join if line.rstrip.end_with?(",")
    +
    +  newline = line.end_with?("\n") ? "\n" : ""
    +  lines[entry_index] = "#{line.delete_suffix("\n").rstrip},#{newline}"
    +  lines.join
     end
    -
    # File 'lib/kettle/jem.rb', line 9785
    +      
    # File 'lib/kettle/jem.rb', line 8027
     
    -def author_given_names(name)
    -  parts = name.to_s.strip.split(/\s+/)
    -  return "" if parts.size < 2
    +def gemspec_files_collection_groups(record:, element_nodes:, lines:)
    +  pending = []
    +  groups = []
    +  body_lines = lines[1...-1]
    +  nodes = element_nodes.dup
     
    -  parts[0...-1].join(" ")
    +  body_lines.each_with_index do |line, body_index|
    +    current_entry = nodes.first
    +
    +    if current_entry && current_entry.location.start_line == record.fetch(:start_line) + body_index + 1
    +      unless gemspec_files_collection_entry_node?(current_entry)
    +        groups = nil
    +        break
    +      end
    +
    +      groups << {
    +        key: gemspec_files_collection_entry_key(current_entry),
    +        node: current_entry,
    +        lines: pending + [line]
    +      }
    +      pending = []
    +      nodes.shift
    +      next
    +    end
    +
    +    if line.strip.empty? || line.lstrip.start_with?("#")
    +      pending << line
    +      next
    +    end
    +  end
    +
    +  return unless groups
    +  return if nodes.any?
    +
    +  groups
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -21984,49 +37371,62 @@

    -

    +

    - .author_template_tokens(author) ⇒ Object + .gemspec_files_collection_has_package_metadata_splat?(parts) ⇒ Boolean -

     
     
    -8228
    -8229
    -8230
    -8231
    -8232
    -8233
    -8234
    +8142 +8143 +8144 +8145 +8146 +8147
    -
    # File 'lib/kettle/jem.rb', line 8228
    +      
    # File 'lib/kettle/jem.rb', line 8142
     
    -def author_names(, copyright, primary_name)
    -  names = Array([:authors]).map(&:to_s)
    -  names = names.select { |name| present_template_token_value?(name) }
    -  names = copyright_author_names(copyright) if names.empty?
    -  names = [primary_name.to_s] if names.empty?
    -  names.map(&:strip).reject(&:empty?).uniq
    +def gemspec_files_collection_has_nonliteral_entries?(parts)
    +  parts.fetch(:groups).any? do |group|
    +    node = group.fetch(:node)
    +    !node.is_a?(::Prism::StringNode)
    +  end
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -22034,9 +37434,9 @@

    -

    +

    - .bash_merge_options(recipe) ⇒ Object + .gemspec_files_collection_kind(value_node) ⇒ Object @@ -22048,33 +37448,21 @@

     
     
    -5820
    -5821
    -5822
    -5823
    -5824
    -5825
    -5826
    -5827
    -5828
    -5829
    -5830
    -5831
    +7992 +7993 +7994 +7995 +7996 +7997

    @@ -22082,49 +37470,60 @@

    -

    +

    - .build_changelog_unreleased_section(heading, items) ⇒ Object + .gemspec_files_collection_needs_concat?(target_parts, groups) ⇒ Boolean -

     
     
    -8214
    -8215
    -8216
    -8217
    -8218
    -8219
    -8220
    -8221
    -8222
    -8223
    -8224
    -8225
    -8226
    +8133 +8134 +8135 +8136 +8137 +8138 +8139 +8140
    -
    # File 'lib/kettle/jem.rb', line 8214
    +      
    # File 'lib/kettle/jem.rb', line 8133
     
    -def author_template_tokens(author)
    -  names = Array(author[:names]).map(&:to_s).reject(&:empty?)
    -  names = [author[:name].to_s] if names.empty?
    -  {
    -    "KJ|AUTHOR:NAME" => author[:name].to_s,
    -    "KJ|AUTHOR:NAMES" => ruby_array_literal(names),
    -    "KJ|AUTHOR:GIVEN_NAMES" => author[:given_names].to_s,
    -    "KJ|AUTHOR:FAMILY_NAMES" => author[:family_names].to_s,
    -    "KJ|AUTHOR:EMAIL" => author[:email].to_s,
    -    "KJ|AUTHOR:DOMAIN" => author[:domain].to_s,
    -    "KJ|AUTHOR:ORCID" => author[:orcid].to_s
    -  }
    +def (parts)
    +  parts.fetch(:groups).any? do |group|
    +    key = group.fetch(:key)
    +    key.is_a?(Array) &&
    +      key.first == :splat &&
    +      (key[1] == "package_metadata_files" || key[1] == [:call, nil, :package_metadata_files, []])
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 5820
    +      
    # File 'lib/kettle/jem.rb', line 7992
     
    -def bash_merge_options(recipe)
    -  options = {
    -    preference: (recipe.dig(:template_preference, :preference) || "destination").to_sym,
    -    add_template_only_nodes: true,
    -    freeze_token: recipe.dig(:template_preference, :freeze_token) || "kettle-jem"
    -  }
    -  if !recipe.dig(:template_preference, :add_template_only_nodes).nil?
    -    configured = DecisionPolicy.value_to_boolean(recipe.dig(:template_preference, :add_template_only_nodes))
    -    options[:add_template_only_nodes] = configured unless configured.nil?
    -  end
    -  options
    +def gemspec_files_collection_kind(value_node)
    +  return :dir if gemspec_files_dir_call_node?(value_node)
    +  return :array if value_node.is_a?(::Prism::ArrayNode)
    +
    +  nil
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -22132,9 +37531,9 @@

    -

    +

    - .changed_files_from_recipe_reports(recipe_reports) ⇒ Object + .gemspec_files_collection_parts(record) ⇒ Object @@ -22146,25 +37545,25 @@

     
     
    -3103
    -3104
    -3105
    -3106
    -3107
    -3108
    -3109
    -3110
    +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923

    @@ -22172,9 +37571,9 @@

    -

    +

    - .changelog_bullet_line?(line) ⇒ Boolean + .gemspec_files_concat_call_node?(node) ⇒ Boolean @@ -22209,17 +37608,23 @@

     
     
    -3793
    -3794
    -3795
    -3796
    +8012 +8013 +8014 +8015 +8016 +8017 +8018

    @@ -22227,9 +37632,9 @@

    -

    +

    - .changelog_coverage_kloc(section) ⇒ Object + .gemspec_files_concat_collection_parts(record, value_node) ⇒ Object @@ -22241,59 +37646,73 @@

     
     
    -4453
    -4454
    -4455
    -4456
    -4457
    -4458
    -4459
    -4460
    +7943 +7944 +7945 +7946 +7947 +7948 +7949 +7950 +7951 +7952 +7953 +7954 +7955 +7956 +7957 +7958 +7959 +7960 +7961 +7962 +7963 +7964 +7965 +7966 +7967 +7968 +7969 +7970 +7971 +7972 +7973 +7974

    - -
     
     
    -3779
    -3780
    -3781
    -3782
    -3783
    -3784
    -3785
    -3786
    -3787
    -3788
    -3789
    -3790
    -3791
    +7807 +7808 +7809 +7810 +7811 +7812 +7813
    -
    # File 'lib/kettle/jem.rb', line 3779
    +      
    # File 'lib/kettle/jem.rb', line 7807
     
    -def build_changelog_unreleased_section(heading, items)
    -  lines = [heading]
    -  CHANGELOG_STANDARD_HEADINGS.each do |standard_heading|
    -    lines << ""
    -    lines << standard_heading
    -    lines << ""
    -    section_items = items[standard_heading].to_a.dup
    -    section_items.pop while section_items.any? && section_items.last.to_s.strip.empty?
    -    lines.concat(section_items) if section_items.any?
    -  end
    -  lines << ""
    -  lines
    +def gemspec_files_collection_needs_concat?(target_parts, groups)
    +  target_parts.fetch(:collection_kind) == :array &&
    +    groups.any? do |group|
    +      group.fetch(:source_collection_kind) == :dir &&
    +        group.fetch(:node).is_a?(::Prism::StringNode)
    +    end
     end
    -
    # File 'lib/kettle/jem.rb', line 3103
    +      
    # File 'lib/kettle/jem.rb', line 7916
     
    -def changed_files_from_recipe_reports(recipe_reports)
    -  latest_by_path = {}
    -  recipe_reports.each do |report|
    -    path = report[:relative_path]
    -    latest_by_path[path] = report if path
    +def gemspec_files_collection_parts(record)
    +  value_node = record.fetch(:value_node)
    +  if gemspec_files_concat_call_node?(value_node)
    +    return gemspec_files_concat_collection_parts(record, value_node)
       end
    -  latest_by_path.values.filter_map { |report| report[:relative_path] if report[:changed] }.uniq.sort
    +
    +  gemspec_files_single_collection_parts(record, value_node)
     end
    -
    # File 'lib/kettle/jem.rb', line 3793
    +      
    # File 'lib/kettle/jem.rb', line 8012
     
    -def changelog_bullet_line?(line)
    -  stripped = line.to_s.lstrip
    -  stripped.start_with?("- ", "* ")
    +def gemspec_files_concat_call_node?(node)
    +  node.is_a?(::Prism::CallNode) &&
    +    node.name == :+ &&
    +    node.block.nil? &&
    +    node.receiver &&
    +    Array(node.arguments&.arguments).length == 1
     end
    -
    # File 'lib/kettle/jem.rb', line 4453
    +      
    # File 'lib/kettle/jem.rb', line 7943
     
    -def changelog_coverage_kloc(section)
    -  return if section.to_s.empty?
    -
    -  match = section.to_s.match(/-\s*COVERAGE:\s*.+--\s*\d+\/(\d+)\s+lines/i)
    -  return unless match
    -
    -  format("%.3f", match[1].to_i.to_f / 1000.0)
    -end
    -
    -
    - -
    -

    - - .changelog_template_header(lines, unreleased_index) ⇒ Object - - - - - -

    - - - @@ -22301,9 +37720,9 @@

    -

    +

    - .changelog_unreleased_end_index(lines, unreleased_index) ⇒ Object + .gemspec_files_concat_collection_source(target_parts, groups) ⇒ Object @@ -22315,33 +37734,37 @@

     
     
    -3737
    -3738
    -3739
    -3740
    -3741
    -3742
    -3743
    -3744
    -3745
    -3746
    -3747
    -3748
    +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828

    @@ -22349,9 +37772,9 @@

    -

    +

    - .changelog_unreleased_heading?(heading_text) ⇒ Boolean + .gemspec_files_dir_call_node?(node) ⇒ Boolean @@ -22386,19 +37809,21 @@

     
     
    -3825
    -3826
    -3827
    -3828
    -3829
    +8020 +8021 +8022 +8023 +8024 +8025

    @@ -22406,58 +37831,69 @@

    -

    +

    - .changelog_unreleased_heading_line?(line) ⇒ Boolean + .gemspec_files_dir_collection_source(target_parts, groups, closing: nil) ⇒ Object -

    -
    - +

    -
    +def gemspec_files_concat_collection_parts(record, value_node)
    +  arguments = Array(value_node.arguments&.arguments)
    +  left_record = gemspec_files_child_collection_record(record, value_node.receiver)
    +  right_record = gemspec_files_child_collection_record(record, arguments.first)
    +  return unless left_record && right_record
     
    +  left_parts = gemspec_files_single_collection_parts(
    +    left_record,
    +    value_node.receiver
    +  )
    +  right_parts = gemspec_files_single_collection_parts(
    +    right_record,
    +    arguments.first
    +  )
    +  return unless left_parts && right_parts
     
    -3720
    -3721
    -3722
    -3723
    -3724
    -
    -
    # File 'lib/kettle/jem.rb', line 3720
    +  groups = left_parts.fetch(:groups).map do |group|
    +    group.merge(source_collection_kind: left_parts.fetch(:collection_kind))
    +  end
    +  groups.concat(
    +    right_parts.fetch(:groups).map do |group|
    +      group.merge(source_collection_kind: right_parts.fetch(:collection_kind))
    +    end
    +  )
     
    -def changelog_template_header(lines, unreleased_index)
    -  header = lines[0...unreleased_index].to_a
    -  header.pop while header.any? && header.last.to_s.strip.empty?
    -  header
    +  {
    +    collection_kind: :concat,
    +    opening: left_parts.fetch(:opening),
    +    closing: right_parts.fetch(:closing),
    +    groups: groups
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 3737
    -
    -def changelog_unreleased_end_index(lines, unreleased_index)
    -  index = unreleased_index + 1
    -  while index < lines.length
    -    line = lines.fetch(index)
    -    # Markdown link-reference definitions are footer content, not Unreleased section body.
    -    return index if markdown_link_reference_definition_line?(line)
    -    return index if line.start_with?("# ") || (line.start_with?("## ") && !changelog_unreleased_heading_line?(line))
    +      
    # File 'lib/kettle/jem.rb', line 7815
     
    -    index += 1
    +def gemspec_files_concat_collection_source(target_parts, groups)
    +  dir_groups, array_groups = groups.partition do |group|
    +    group.fetch(:source_collection_kind) == :dir &&
    +      group.fetch(:node).is_a?(::Prism::StringNode)
       end
    -  lines.length
    +  return gemspec_files_array_collection_source(target_parts, array_groups) if dir_groups.empty?
    +  return gemspec_files_dir_collection_source(target_parts, dir_groups) if array_groups.empty?
    +
    +  [
    +    gemspec_files_dir_collection_source(target_parts, dir_groups, closing: "] + [\n"),
    +    gemspec_files_collection_body_source(array_groups),
    +    target_parts.fetch(:closing)
    +  ].join
     end
    -
    # File 'lib/kettle/jem.rb', line 3825
    +      
    # File 'lib/kettle/jem.rb', line 8020
     
    -def changelog_unreleased_heading?(heading_text)
    -  text = heading_text.to_s.strip
    -  text = text[1...-1] if text.start_with?("[") && text.end_with?("]")
    -  text.casecmp("Unreleased").zero?
    +def gemspec_files_dir_call_node?(node)
    +  node.is_a?(::Prism::CallNode) &&
    +    node.name == :[] &&
    +    node.block.nil? &&
    +    node.receiver&.slice == "Dir"
     end
    + + + + +
    +
     
     
    -  
    +7830
    +7831
    +7832
    +7833
    +7834
    +7835
    +7836
    +7837
    +
    +
    # File 'lib/kettle/jem.rb', line 7830
    +
    +def gemspec_files_dir_collection_source(target_parts, groups, closing: nil)
    +  opening = target_parts.fetch(:opening).sub("= [", "= Dir[")
    +  [
    +    opening,
    +    gemspec_files_collection_body_source(groups),
    +    closing || target_parts.fetch(:closing)
    +  ].join
    +end
    +
    -
    + +
    +

    -

    Returns:

    -
      + .gemspec_files_group_collection_kind(group, parts) ⇒ Object -
    • - - - (Boolean) - - - -
    • + -
    -

    + +
    @@ -22465,9 +37901,9 @@

    -

    +

    - .changelog_unreleased_items(body_lines) ⇒ Object + .gemspec_files_single_collection_parts(record, value_node) ⇒ Object @@ -22479,57 +37915,43 @@

     
     
    -3754
    -3755
    -3756
    -3757
    -3758
    -3759
    -3760
    -3761
    -3762
    -3763
    -3764
    -3765
    -3766
    -3767
    -3768
    -3769
    -3770
    -3771
    -3772
    -3773
    -3774
    -3775
    -3776
    -3777
    +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7936 +7937 +7938 +7939 +7940 +7941

    @@ -22537,9 +37959,9 @@

    -

    +

    - .changelog_unreleased_line_index(lines) ⇒ Object + .gemspec_files_splat_expression_key(node) ⇒ Object @@ -22551,15 +37973,33 @@

     
     
    -3726
    -3727
    -3728
    +8076 +8077 +8078 +8079 +8080 +8081 +8082 +8083 +8084 +8085 +8086 +8087

    @@ -22567,9 +38007,9 @@

    -

    +

    - .changelog_version_heading_line?(line, version) ⇒ Boolean + .gemspec_freeze_block_structurally_managed?(block, receiver:) ⇒ Boolean @@ -22604,97 +38044,19 @@

     
     
    -4444
    -4445
    -4446
    -4447
    -4448
    -4449
    -4450
    -4451
    - -

    - -
     
     
    -3730
    -3731
    -3732
    -3733
    -3734
    -3735
    +8008 +8009 +8010
    -
    # File 'lib/kettle/jem.rb', line 3730
    -
    -def changelog_unreleased_heading_line?(line)
    -  text = line.to_s.strip
    -  return false unless text.start_with?("## ")
    +      
    # File 'lib/kettle/jem.rb', line 8008
     
    -  changelog_unreleased_heading?(text.delete_prefix("## ").strip)
    +def gemspec_files_group_collection_kind(group, parts)
    +  group.fetch(:source_collection_kind, parts.fetch(:collection_kind))
     end
    -
    # File 'lib/kettle/jem.rb', line 3754
    +      
    # File 'lib/kettle/jem.rb', line 7925
     
    -def changelog_unreleased_items(body_lines)
    -  items = {}
    -  heading = nil
    -  index = 0
    -  while index < body_lines.length
    -    line = body_lines.fetch(index)
    -    if line.start_with?("### ")
    -      heading = line.strip
    -      items[heading] ||= []
    -      index += 1
    -      next
    -    end
    +def gemspec_files_single_collection_parts(record, value_node)
    +  element_nodes = gemspec_files_collection_element_nodes(value_node)
    +  return unless element_nodes
     
    -    if changelog_bullet_line?(line)
    -      lines, index = collect_changelog_list_item(body_lines, index)
    -      items[heading] ||= []
    -      items[heading].concat(lines)
    -      next
    -    end
    +  lines = record.fetch(:source).lines
    +  return if lines.length < 3
     
    -    index += 1
    -  end
    -  items
    +  groups = gemspec_files_collection_groups(record: record, element_nodes: element_nodes, lines: lines)
    +  return unless groups
    +
    +  {
    +    collection_kind: gemspec_files_collection_kind(value_node),
    +    opening: lines.first,
    +    closing: lines.last,
    +    groups: groups
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 3726
    +      
    # File 'lib/kettle/jem.rb', line 8076
     
    -def changelog_unreleased_line_index(lines)
    -  lines.index { |line| changelog_unreleased_heading_line?(line) }
    +def gemspec_files_splat_expression_key(node)
    +  if node.is_a?(::Prism::CallNode)
    +    return [
    +      :call,
    +      node.receiver&.slice,
    +      node.name,
    +      Array(node.arguments&.arguments).map { |argument| ruby_static_string_value(argument) || argument.slice }
    +    ]
    +  end
    +
    +  node&.slice
     end
    -
    # File 'lib/kettle/jem.rb', line 4444
    -
    -def changelog_version_heading_line?(line, version)
    -  text = line.to_s.strip
    -  return false unless text.start_with?("## ")
    -
    -  heading = text.delete_prefix("## ").strip
    -  heading = heading[1...heading.index("]")] if heading.start_with?("[") && heading.include?("]")
    -  heading == version || heading.start_with?("#{version} ")
    -end
    -
    -
    - -
    -

    - - .classify_namespace(name) ⇒ Object - - - - - -

    - - - - -
    -
    -
    -
    -10878
    -10879
    -10880
    -
    -
    # File 'lib/kettle/jem.rb', line 10878
    -
    -def classify_namespace(name)
    -  name.to_s.split(/[-_]/).map { |part| part[0].to_s.upcase + part[1..].to_s }.join("::")
    -end
    -
    -
    - -
    -

    - - .codeberg_repo_url(repository, repo_slug, suffix) ⇒ Object - - - - - -

    - - @@ -22702,9 +38064,9 @@

    -

    +

    - .collapse_excess_blank_lines(content) ⇒ Object + .gemspec_legacy_version_loader_block(entrypoint_require:, namespace:, min_ruby:) ⇒ Object @@ -22716,43 +38078,73 @@

     
     
    -8829
    -8830
    -8831
    -8832
    -8833
    -8834
    -8835
    -8836
    -8837
    -8838
    -8839
    -8840
    +7436 +7437 +7438 +7439 +7440 +7441 +7442 +7443 +7444 +7445 +7446 +7447 +7448 +7449 +7450 +7451 +7452 +7453 +7454 +7455 +7456 +7457 +7458 +7459 +7460 +7461 +7462

    -
    -
    -
    -9112
    -9113
    -9114
    -9115
    -9116
    -9117
    -9118
    -9119
    -9120
    +8240 +8241 +8242 +8243 +8244
    -
    # File 'lib/kettle/jem.rb', line 9112
    -
    -def codeberg_repo_url(repository, repo_slug, suffix)
    -  resources = repository[:resource_urls] || {}
    -  return resources[:codeberg_issues_url] if suffix == "issues" && resources[:codeberg_issues_url]
    -  return resources[:codeberg_pulls_url] if suffix == "pulls" && resources[:codeberg_pulls_url]
    +      
    # File 'lib/kettle/jem.rb', line 8240
     
    -  base = repository[:codeberg_url].to_s
    -  base = "https://codeberg.org/#{repo_slug}" if base.empty?
    -  "#{base}/#{suffix}"
    +def gemspec_freeze_block_structurally_managed?(block, receiver:)
    +  gemspec_assignment_records(block.join, receiver: receiver).any? { |record| record.fetch(:field) == "files" }
    +rescue Ast::Crispr::Error, Prism::ParseError
    +  false
     end
    -
    # File 'lib/kettle/jem.rb', line 8829
    +      
    # File 'lib/kettle/jem.rb', line 7436
     
    -def collapse_excess_blank_lines(content)
    -  blank_count = 0
    -  content.to_s.lines.filter_map do |line|
    -    if line.strip.empty?
    -      blank_count += 1
    -      next if blank_count > 1
    +def gemspec_legacy_version_loader_block(entrypoint_require:, namespace:, min_ruby:)
    +  legacy_require =
    +    if min_ruby >= REQUIRE_RELATIVE_MIN_RUBY
    +      %(require_relative "lib/#{entrypoint_require}/version")
         else
    -      blank_count = 0
    -    end
    -    line
    -  end.join
    -end
    + <<~RUBY.chomp + # NOTE: Use __FILE__ or __dir__ until removal of Ruby 1.x support + # __dir__ introduced in Ruby 1.9.1 + lib = File.expand_path("lib", File.dirname(__FILE__)) + $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) + require "#{entrypoint_require}/version" + RUBY + end + + <<~RUBY + gem_version = + if Gem.ruby_version >= Gem::Version.new("3.1") + # Loading Version into an anonymous module allows version.rb to get code coverage from SimpleCov! + # See: https://github.com/simplecov-ruby/simplecov/issues/557#issuecomment-2630782358 + # See: https://github.com/panorama-ed/memo_wise/pull/397 + #{gemspec_modern_version_loader_expression(entrypoint_require: entrypoint_require, namespace: namespace)} + else + #{legacy_require.gsub("\n", "\n ")} + #{namespace}::Version::VERSION + end + RUBY +end
    -

    +

    - .collect_changelog_list_item(lines, start_index) ⇒ Object + .gemspec_legacy_version_loader_preamble_line_range(content) ⇒ Object @@ -22764,61 +38156,47 @@

     
     
    -3798
    -3799
    -3800
    -3801
    -3802
    -3803
    -3804
    -3805
    -3806
    -3807
    -3808
    -3809
    -3810
    -3811
    -3812
    -3813
    -3814
    -3815
    -3816
    -3817
    -3818
    -3819
    -3820
    -3821
    -3822
    -3823
    +7476 +7477 +7478 +7479 +7480 +7481 +7482 +7483 +7484 +7485 +7486 +7487 +7488 +7489 +7490 +7491 +7492 +7493 +7494 -
    # File 'lib/kettle/jem.rb', line 3798
    -
    -def collect_changelog_list_item(lines, start_index)
    -  line = lines.fetch(start_index).to_s
    -  base_indent = line.length - line.lstrip.length
    -  item_lines = [line.rstrip]
    -  index = start_index + 1
    -  in_fence = false
    -  while index < lines.length
    -    current = lines.fetch(index).to_s
    -    current_indent = current.length - current.lstrip.length
    -    break if !in_fence && current.start_with?("### ")
    -    break if !in_fence && changelog_bullet_line?(current) && current_indent <= base_indent
    +      
    # File 'lib/kettle/jem.rb', line 7476
     
    -    if current.lstrip.start_with?("```")
    -      in_fence = !in_fence
    -      item_lines << current.rstrip
    -      index += 1
    -      next
    -    end
    +def gemspec_legacy_version_loader_preamble_line_range(content)
    +  lines = content.to_s.lines
    +  start_index = lines.index do |line|
    +    # Prism has represented this legacy multiline assignment inconsistently across
    +    # parser versions; this fallback is limited to the exact top-level preamble
    +    # shape immediately preceding Gem::Specification.new.
    +    line.match?(/\Agem_version\s*=/)
    +  end
    +  return unless start_index
     
    -    break unless in_fence || current.strip.empty? || current_indent > base_indent
    +  gemspec_index = lines.each_with_index.find do |line, index|
    +    index > start_index && line.include?("Gem::Specification.new")
    +  end&.last
    +  return unless gemspec_index
     
    -    item_lines << current.rstrip
    -    index += 1
    -  end
    -  [item_lines, index]
    +  end_line = gemspec_index
    +  end_line -= 1 while end_line > start_index && lines[end_line - 1].strip.empty?
    +  {start_line: start_index + 1, end_line: end_line}
     end
    @@ -22826,9 +38204,9 @@

    -

    +

    - .collect_yaml_scalar_path_entries(node, path, entries) ⇒ Object + .gemspec_modern_version_loader_expression(entrypoint_require:, namespace:) ⇒ Object @@ -22840,43 +38218,15 @@

     
     
    -11533
    -11534
    -11535
    -11536
    -11537
    -11538
    -11539
    -11540
    -11541
    -11542
    -11543
    -11544
    -11545
    -11546
    -11547
    -11548
    -11549
    +7432 +7433 +7434 -
    # File 'lib/kettle/jem.rb', line 11533
    -
    -def collect_yaml_scalar_path_entries(node, path, entries)
    -  unless node.is_a?(Psych::Nodes::Mapping)
    -    node.children.each { |child| collect_yaml_scalar_path_entries(child, path, entries) } if node.respond_to?(:children)
    -    return
    -  end
    -
    -  node.children.each_slice(2) do |key_node, value_node|
    -    next unless key_node.is_a?(Psych::Nodes::Scalar)
    +      
    # File 'lib/kettle/jem.rb', line 7432
     
    -    child_path = path + [key_node.value.to_s]
    -    if value_node.is_a?(Psych::Nodes::Scalar)
    -      entries << {path: child_path, line: key_node.start_line}
    -    elsif value_node.is_a?(Psych::Nodes::Mapping)
    -      collect_yaml_scalar_path_entries(value_node, child_path, entries)
    -    end
    -  end
    +def gemspec_modern_version_loader_expression(entrypoint_require:, namespace:)
    +  %(Module.new.tap { |mod| Kernel.load("\#{__dir__}/lib/#{entrypoint_require}/version.rb", mod) }::#{namespace}::Version::VERSION)
     end
    @@ -22884,9 +38234,9 @@

    -

    +

    - .commented_gem_call(comment_source) ⇒ Object + .gemspec_new_call(source) ⇒ Object @@ -22898,27 +38248,15 @@

     
     
    -5380
    -5381
    -5382
    -5383
    -5384
    -5385
    -5386
    -5387
    -5388
    +8749 +8750 +8751 -
    # File 'lib/kettle/jem.rb', line 5380
    +      
    # File 'lib/kettle/jem.rb', line 8749
     
    -def commented_gem_call(comment_source)
    -  source = uncomment_ruby_comment_line(comment_source)
    -  return unless source
    -
    -  result = prism_parse_success(source)
    -  body = result&.value&.statements&.body
    -  call = body&.one? ? body.first : nil
    -  call if call.is_a?(::Prism::CallNode) && call.name == :gem
    +def gemspec_new_call(source)
    +  ruby_call_records(source, :new).find { |call| call.receiver&.slice == "Gem::Specification" }
     end
    @@ -22926,9 +38264,9 @@

    -

    +

    - .commented_gem_dependency_block_records(content) ⇒ Object + .gemspec_package_file_includes_token(gemspec) ⇒ Object @@ -22940,37 +38278,43 @@

     
     
    -5278
    -5279
    -5280
    -5281
    -5282
    -5283
    -5284
    -5285
    -5286
    -5287
    -5288
    -5289
    -5290
    -5291
    +12315 +12316 +12317 +12318 +12319 +12320 +12321 +12322 +12323 +12324 +12325 +12326 +12327 +12328 +12329 +12330 +12331 -
    # File 'lib/kettle/jem.rb', line 5278
    +      
    # File 'lib/kettle/jem.rb', line 12315
     
    -def commented_gem_dependency_block_records(content)
    -  lines = content.to_s.lines
    -  commented_gem_dependency_records(content).map do |record|
    -    start_index = record.fetch(:start_line) - 1
    -    while start_index.positive? && gemfile_comment_line?(lines[start_index - 1])
    -      start_index -= 1
    -    end
    -    record.merge(
    -      block_start_line: start_index + 1,
    -      block_end_line: record.fetch(:end_line),
    -      source_lines: lines[start_index..(record.fetch(:end_line) - 1)] || []
    -    )
    +def gemspec_package_file_includes_token(gemspec)
    +  includes = Array(gemspec[:package_file_includes] || gemspec["package_file_includes"])
    +    .map { |path| path.to_s.strip }
    +    .reject(&:empty?)
    +    .uniq
    +  return "" if includes.empty?
    +
    +  lines = [
    +    "",
    +    "    # Extra package files configured by .structuredmerge/kettle-jem.yml"
    +  ]
    +  includes.each_with_index do |pattern, index|
    +    comma = (index < includes.length - 1) ? "," : ""
    +    lines << %(    *Dir.glob(#{pattern.dump}, File::FNM_DOTMATCH).select { |path| File.file?(path) }#{comma})
       end
    +  ",#{lines.join("\n")}"
     end
    @@ -22978,33 +38322,54 @@

    -

    +

    - .commented_gem_dependency_blocks(content) ⇒ Object + .gemspec_path_declares_gem?(path, gem_name) ⇒ Boolean -

    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -23012,9 +38377,9 @@

    -

    +

    - .commented_gem_dependency_records(content) ⇒ Object + .gemspec_policy_operations(template_content, original, final, request) ⇒ Object @@ -23026,41 +38391,85 @@

     
     
    -5363
    -5364
    -5365
    -5366
    -5367
    -5368
    -5369
    -5370
    -5371
    -5372
    -5373
    -5374
    -5375
    -5376
    -5377
    -5378
    +4725 +4726 +4727 +4728 +4729 +4730 +4731 +4732 +4733 +4734 +4735 +4736 +4737 +4738 +4739 +4740 +4741 +4742 +4743 +4744 +4745 +4746 +4747 +4748 +4749 +4750 +4751 +4752 +4753 +4754 +4755 +4756 +4757 +4758 +4759 +4760 +4761 +4762

    @@ -23068,9 +38477,9 @@

    -

    +

    - .compact_hash(hash) ⇒ Object + .gemspec_preserved_assignment_fieldsObject @@ -23082,15 +38491,35 @@

     
     
    -11674
    -11675
    -11676
    +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719

    @@ -23098,9 +38527,9 @@

    -

    +

    - .concrete_github_url(url) ⇒ Object + .gemspec_preserved_assignments(source, receiver:) ⇒ Object @@ -23112,15 +38541,29 @@

     
     
    -8953
    -8954
    -8955
    +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705

    @@ -23128,9 +38571,9 @@

    -

    +

    - .config_min_ruby(config) ⇒ Object + .gemspec_project_emoji(gemspec_metadata) ⇒ Object @@ -23142,19 +38585,29 @@

     
     
    -10605
    -10606
    -10607
    -10608
    -10609
    +9432 +9433 +9434 +9435 +9436 +9437 +9438 +9439 +9440 +9441

    @@ -23162,9 +38615,9 @@

    -

    +

    - .config_test_min_ruby(config, gem_min_ruby = nil) ⇒ Object + .gemspec_root_license_files_token(license) ⇒ Object @@ -23176,41 +38629,17 @@

     
     
    -10611
    -10612
    -10613
    -10614
    -10615
    -10616
    -10617
    -10618
    -10619
    -10620
    -10621
    -10622
    -10623
    -10624
    -10625
    -10626
    +12411 +12412 +12413 +12414

    @@ -23218,9 +38647,9 @@

    -

    +

    - .configured_readme_top_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object + .gemspec_runtime_dependency_names(gemspec_metadata) ⇒ Object @@ -23232,35 +38661,69 @@

     
     
    -9282
    -9283
    -9284
    -9285
    -9286
    -9287
    -9288
    -9289
    -9290
    -9291
    -9292
    -9293
    -9294
    +11008 +11009 +11010 +11011 +11012 +11013 +11014 +11015 +11016 +11017 +11018

    + +
     
     
    -5272
    -5273
    -5274
    -5275
    -5276
    +3861 +3862 +3863 +3864
    -
    # File 'lib/kettle/jem.rb', line 5272
    +      
    # File 'lib/kettle/jem.rb', line 3861
     
    -def commented_gem_dependency_blocks(content)
    -  commented_gem_dependency_block_records(content).to_h do |record|
    -    [record.fetch(:name), record.fetch(:source_lines)]
    -  end
    +def gemspec_path_declares_gem?(path, gem_name)
    +  normalized_path = path.to_s.delete_suffix("/")
    +  normalized_path == "gems/#{gem_name}"
     end
    -
    # File 'lib/kettle/jem.rb', line 5363
    -
    -def commented_gem_dependency_records(content)
    -  result = prism_parse_success(content)
    -  return [] unless result
    -
    -  result.comments.filter_map do |comment|
    -    call = commented_gem_call(comment.location.slice)
    -    name = ruby_string_argument(call)
    -    next unless name
    +      
    # File 'lib/kettle/jem.rb', line 4725
     
    +def gemspec_policy_operations(template_content, original, final, request)
    +  template_receiver = gemspec_block_param(template_content) || "spec"
    +  destination_receiver = gemspec_block_param(original) || "spec"
    +  package_name = runtime_context_value(request, :package, :name).to_s
    +  self_dependency_names = gemspec_self_dependency_names(request, package_name)
    +  operations = [
         {
    -      name: name,
    -      start_line: comment.location.start_line,
    -      end_line: comment.location.end_line
    +      operation: "preserve_project_fields",
    +      preserved_fields: gemspec_preserved_assignments(original, receiver: destination_receiver).keys.select do |field|
    +        final.include?("#{template_receiver}.#{field} =")
    +      end.sort
    +    },
    +    {
    +      operation: "preserve_dependency_declarations",
    +      preserved_dependencies: gemspec_dependency_line_index(original, receiver: destination_receiver).keys.map(&:last).select do |gem_name|
    +        final.include?(%("#{gem_name}"))
    +      end.sort
    +    },
    +    {
    +      operation: "delete_self_dependency_declarations",
    +      deleted_dependency_count: [
    +        gemspec_dependency_names("#{template_content}\n#{original}").count { |name| self_dependency_names.include?(name) } -
    +          gemspec_dependency_names(final).count { |name| self_dependency_names.include?(name) },
    +        0
    +      ].max
    +    }
    +  ]
    +  version_loader_operation = gemspec_version_loader_policy_operation(original, final, request)
    +  operations << version_loader_operation if version_loader_operation
    +  if template_receiver != destination_receiver
    +    operations << {
    +      operation: "normalize_gemspec_receiver",
    +      from: destination_receiver,
    +      to: template_receiver
         }
       end
    +  operations
     end
    -
    # File 'lib/kettle/jem.rb', line 11674
    +      
    # File 'lib/kettle/jem.rb', line 7707
     
    -def compact_hash(hash)
    -  hash.reject { |_key, value| value.nil? || (value.respond_to?(:empty?) && value.empty?) }
    +def gemspec_preserved_assignment_fields
    +  %w[
    +    name
    +    authors
    +    email
    +    summary
    +    description
    +    homepage
    +    licenses
    +    required_ruby_version
    +    executables
    +  ]
     end
    -
    # File 'lib/kettle/jem.rb', line 8953
    +      
    # File 'lib/kettle/jem.rb', line 7696
     
    -def concrete_github_url(url)
    -  github_org_from_url(url) ? url.to_s : nil
    +def gemspec_preserved_assignments(source, receiver:)
    +  gemspec_assignment_records(source, receiver: receiver).each_with_object({}) do |record, assignments|
    +    field = record.fetch(:field)
    +    next unless gemspec_preserved_assignment_fields.include?(field)
    +    next if assignments.key?(field)
    +    next if record.fetch(:source).include?("TODO:")
    +
    +    assignments[field] = record.fetch(:source)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 10605
    +      
    # File 'lib/kettle/jem.rb', line 9432
     
    -def config_min_ruby(config)
    -  value = config.dig("rubygems", "min_ruby") || config["min_ruby"]
    -  version = value.to_s[/\d+\.\d+(?:\.\d+)?/]
    -  version && Gem::Version.new(version)
    +def gemspec_project_emoji()
    +  [
    +    (, :summary),
    +    (, :description)
    +  ].each do |value|
    +    candidate = first_grapheme(value)
    +    return candidate if decorative_grapheme?(candidate)
    +  end
    +  nil
     end
    -
    # File 'lib/kettle/jem.rb', line 10611
    +      
    # File 'lib/kettle/jem.rb', line 12411
     
    -def config_test_min_ruby(config, gem_min_ruby = nil)
    -  config ||= {}
    -  configured = config.dig("ruby", "test_minimum")
    -  configured_version = configured.to_s[/\d+\.\d+(?:\.\d+)?/]
    -  test_minimum = configured_version ? Gem::Version.new(configured_version) : DEFAULT_TEST_MINIMUM_RUBY
    -  test_minimum = [test_minimum, DEFAULT_TEST_MINIMUM_RUBY].max
    -  gem_minimum = if gem_min_ruby
    -    token = minimum_ruby_token(gem_min_ruby)
    -    Gem::Version.new(token) unless token.empty?
    -  else
    -    config_min_ruby(config)
    -  end
    -  gem_minimum ? [test_minimum, gem_minimum].max : test_minimum
    -rescue ArgumentError
    -  DEFAULT_TEST_MINIMUM_RUBY
    +def gemspec_root_license_files_token(license)
    +  files = (["LICENSE.md"] + Array(license[:spdx]).map { |spdx_id| "#{spdx_basename(spdx_id)}.md" }).uniq
    +  files.map { |file| "    #{file.dump},\n" }.join
     end
    -
    # File 'lib/kettle/jem.rb', line 9282
    +      
    # File 'lib/kettle/jem.rb', line 11008
     
    -def configured_readme_top_logo_entries(config, org:, gem_name:, repository: {})
    -  readme_config = (config.is_a?(Hash) && config["readme"].is_a?(Hash)) ? config["readme"] : {}
    -  logo_row = readme_config["logo_row"]
    -  return unless logo_row.is_a?(Hash)
    -  return [] if falsey_config?(logo_row["enabled"])
    +def gemspec_runtime_dependency_names()
    +  dependencies = Array(
    +    [:runtime_dependencies] || ["runtime_dependencies"]
    +  )
    +  dependencies.each_with_object([]) do |dependency, names|
    +    name = dependency.respond_to?(:name) ? dependency.name.to_s : dependency.to_s
    +    next if name.empty? || names.include?(name)
     
    -  logos = Array(logo_row["logos"]).first(4)
    -  return [] if logos.empty?
    +    names << name
    +  end
    +end
    +
    +
    + +
    +

    + + .gemspec_runtime_floor_token(facts) ⇒ Object + - logos.filter_map do || - readme_top_logo_entry_from_config(, org: org, gem_name: gem_name, repository: repository) - end.then { |entries| deduplicate_readme_top_logo_entries(entries) } + + + +

    + + + @@ -23268,9 +38731,9 @@

    -

    +

    - .content_recipe_execution_report(request:, final_content:, changed:, step_reports:, diagnostics:, metadata: nil) ⇒ Object + .gemspec_self_dependency_names(request, package_name) ⇒ Object @@ -23282,29 +38745,21 @@

     
     
    -3612
    -3613
    -3614
    -3615
    -3616
    -3617
    -3618
    -3619
    -3620
    -3621
    +8561 +8562 +8563 +8564 +8565 +8566

    @@ -23312,9 +38767,9 @@

    -

    +

    - .content_recipe_execution_report_envelope(report) ⇒ Object + .gemspec_template_facts(config) ⇒ Object @@ -23326,23 +38781,23 @@

    -3623 -3624 -3625 -3626 -3627 -3628 -3629 +12301 +12302 +12303 +12304 +12305 +12306 +12307

    @@ -23350,9 +38805,9 @@

    -

    +

    - .content_recipe_execution_request(recipe_name:, recipe_version:, relative_path:, provider_family:, template_content:, destination_content:, steps:, provider_backend: nil, runtime_context: nil, metadata: nil) ⇒ Object + .gemspec_template_tokens(gemspec) ⇒ Object @@ -23364,39 +38819,19 @@

     
     
    -3588
    -3589
    -3590
    -3591
    -3592
    -3593
    -3594
    -3595
    -3596
    -3597
    -3598
    -3599
    -3600
    -3601
    -3602
    +12309 +12310 +12311 +12312 +12313

    @@ -23404,9 +38839,9 @@

    -

    +

    - .content_recipe_execution_request_envelope(request) ⇒ Object + .gemspec_top_level_gem_version_node(content) ⇒ Object @@ -23418,23 +38853,33 @@

    -3604 -3605 -3606 -3607 -3608 -3609 -3610 +7507 +7508 +7509 +7510 +7511 +7512 +7513 +7514 +7515 +7516 +7517 +7518

    @@ -23442,9 +38887,9 @@

    -

    +

    - .content_recipe_step(recipe) ⇒ Object + .gemspec_version_loader_policy_operation(original, final, request) ⇒ Object @@ -23456,51 +38901,43 @@

     
     
    -3950
    -3951
    -3952
    -3953
    -3954
    -3955
    -3956
    -3957
    -3958
    -3959
    -3960
    -3961
    -3962
    -3963
    -3964
    -3965
    -3966
    -3967
    -3968
    -3969
    -3970
    +4764 +4765 +4766 +4767 +4768 +4769 +4770 +4771 +4772 +4773 +4774 +4775 +4776 +4777 +4778 +4779 +4780

    @@ -23508,9 +38945,9 @@

    -

    +

    - .content_recipe_step_report(recipe:, request:, original:, final:, changed:, deletion: nil) ⇒ Object + .generated_blocks_facts(gemspec, facts, run_options) ⇒ Object @@ -23522,73 +38959,21 @@

     
     
    -3972
    -3973
    -3974
    -3975
    -3976
    -3977
    -3978
    -3979
    -3980
    -3981
    -3982
    -3983
    -3984
    -3985
    -3986
    -3987
    -3988
    -3989
    -3990
    -3991
    -3992
    -3993
    -3994
    -3995
    -3996
    -3997
    -3998
    -3999
    -4000
    -4001
    -4002
    -4003
    +3248 +3249 +3250 +3251 +3252 +3253

    @@ -23596,9 +38981,9 @@

    -

    +

    - .copy_only_when_missing_template_path?(relative_path) ⇒ Boolean + .generated_gemspec_metadata_file_group?(group, target_parts) ⇒ Boolean @@ -23633,49 +39018,25 @@

     
     
    -10277
    -10278
    -10279
    - -

    - -
    +
    +
    +
    +7627
    +7628
    +7629
    +7630
    +7631
    +7632
    +7633
    +
    +
    # File 'lib/kettle/jem.rb', line 7627
    +
    +def gemspec_runtime_floor_token(facts)
    +  raw = facts.to_h.dig(:rubygems, :min_ruby).to_s.strip
    +  token = minimum_ruby_token(raw)
    +  return "0" if token.empty? && raw == "0"
    +
    +  token
     end
    -
    # File 'lib/kettle/jem.rb', line 3612
    +      
    # File 'lib/kettle/jem.rb', line 8561
     
    -def content_recipe_execution_report(request:, final_content:, changed:, step_reports:, diagnostics:, metadata: nil)
    -  compact_hash(
    -    request: deep_dup(request),
    -    final_content: final_content.to_s,
    -    changed: changed ? true : false,
    -    step_reports: deep_dup(step_reports),
    -    diagnostics: deep_dup(diagnostics),
    -    metadata: deep_dup( || {})
    -  )
    +def gemspec_self_dependency_names(request, package_name)
    +  names = [package_name.to_s]
    +  token_value = runtime_context_value(request, :template_tokens, "KJ|GEM_NAME")
    +  names << "{KJ|GEM_NAME}" if token_value.to_s == package_name.to_s
    +  names.reject(&:empty?).uniq
     end
    -
    # File 'lib/kettle/jem.rb', line 3623
    +      
    # File 'lib/kettle/jem.rb', line 12301
     
    -def content_recipe_execution_report_envelope(report)
    -  {
    -    kind: "content_recipe_execution_report",
    -    version: CONTENT_RECIPE_TRANSPORT_VERSION,
    -    report: deep_dup(report)
    -  }
    +def gemspec_template_facts(config)
    +  includes = Array(config.dig("gemspec", "package_files", "include"))
    +    .map { |path| path.to_s.strip }
    +    .reject(&:empty?)
    +    .uniq
    +  includes.empty? ? {} : {package_file_includes: includes}
     end
    -
    # File 'lib/kettle/jem.rb', line 3588
    +      
    # File 'lib/kettle/jem.rb', line 12309
     
    -def content_recipe_execution_request(recipe_name:, recipe_version:, relative_path:, provider_family:,
    -  template_content:, destination_content:, steps:, provider_backend: nil, runtime_context: nil, metadata: nil)
    -  compact_hash(
    -    recipe_name: recipe_name.to_s,
    -    recipe_version: recipe_version.to_s,
    -    relative_path: relative_path.to_s,
    -    provider_family: provider_family.to_s,
    -    provider_backend: provider_backend&.to_s,
    -    template_content: template_content.to_s,
    -    destination_content: destination_content.to_s,
    -    steps: deep_dup(steps),
    -    runtime_context: deep_dup(runtime_context || {}),
    -    metadata: deep_dup( || {})
    -  )
    +def gemspec_template_tokens(gemspec)
    +  {
    +    "KJ|GEMSPEC:PACKAGE_FILE_INCLUDES" => gemspec_package_file_includes_token(gemspec)
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 3604
    +      
    # File 'lib/kettle/jem.rb', line 7507
     
    -def content_recipe_execution_request_envelope(request)
    -  {
    -    kind: "content_recipe_execution_request",
    -    version: CONTENT_RECIPE_TRANSPORT_VERSION,
    -    request: deep_dup(request)
    -  }
    +def gemspec_top_level_gem_version_node(content)
    +  ensure_runtime_dependencies!
    +  context = Ast::Crispr::Ruby::Prism.document_context(content: content.to_s, source_label: "gemspec")
    +  gemspec_call = context.structural_owners(owner_scope: :top_level_statements).find do |owner|
    +    owner.is_a?(::Prism::CallNode) && owner.name == :new && owner.receiver&.slice == "Gem::Specification"
    +  end
    +  context.structural_owners(owner_scope: :top_level_statements).find do |owner|
    +    owner.is_a?(::Prism::LocalVariableWriteNode) &&
    +      owner.name == :gem_version &&
    +      (!gemspec_call || owner.location.start_offset < gemspec_call.location.start_offset)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 3950
    +      
    # File 'lib/kettle/jem.rb', line 4764
     
    -def content_recipe_step(recipe)
    -  step = {
    -    step_id: recipe.fetch(:name),
    -    step_kind: recipe.fetch(:primitive),
    -    name: recipe.fetch(:name),
    -    provider_family: recipe.fetch(:provider_family),
    -    metadata: {target_path: recipe.fetch(:target_path)}
    +def gemspec_version_loader_policy_operation(original, final, request)
    +  min_ruby = minimum_ruby_token(runtime_context_value(request, :rubygems, :min_ruby))
    +  return if min_ruby.to_s.empty?
    +
    +  modern = Gem::Version.new(min_ruby) >= MODERN_GEMSPEC_VERSION_LOADER_MIN_RUBY
    +  before_legacy = !gemspec_top_level_gem_version_node(original).nil?
    +  after_legacy = !gemspec_top_level_gem_version_node(final).nil?
    +  {
    +    operation: "rewrite_version_loader",
    +    min_ruby: min_ruby,
    +    mode: modern ? "modern" : "legacy",
    +    legacy_preamble_removed: before_legacy && !after_legacy,
    +    legacy_preamble_present: after_legacy
       }
    -  step[:provider_backend] = recipe[:provider_backend] if recipe[:provider_backend]
    -  if recipe.fetch(:primitive) == "supplied_source_selector_deletion"
    -    step[:step_kind] = "native_policy"
    -    step[:policy] = {
    -      policy_kind: "delete_supplied_structural_owners",
    -      required_context: "delete_selectors",
    -      operation: "delete",
    -      selector_family: "structural_owner_range",
    -      normalize_blank_lines: true
    -    }
    -  end
    -  step
    +rescue ArgumentError, Ast::Crispr::Error
    +  nil
     end
    -
    # File 'lib/kettle/jem.rb', line 3972
    +      
    # File 'lib/kettle/jem.rb', line 3248
     
    -def content_recipe_step_report(recipe:, request:, original:, final:, changed:, deletion: nil)
    -  operation_profile = Ast::Merge.structured_edit_operation_profile(
    -    operation_kind: recipe.fetch(:primitive),
    -    known_operation_kind: true,
    -    source_requirement: "destination_content",
    -    destination_requirement: "relative_path",
    -    replacement_source: "runtime_context",
    -    captures_source_text: false,
    -    supports_if_missing: true,
    -    operation_family: "kettle-jem"
    -  )
    -  result = Ast::Merge.structured_edit_result(
    -    operation_kind: recipe.fetch(:primitive),
    -    updated_content: final,
    -    changed: changed,
    -    operation_profile: operation_profile
    -  )
    -  application = Ast::Merge.structured_edit_application(request: request, result: result)
    -  {
    -    step_id: recipe.fetch(:name),
    -    step_kind: recipe.fetch(:primitive),
    -    status: changed ? "applied" : "unchanged",
    -    changed: changed,
    -    input_content: original,
    -    output_content: final,
    -    application: application,
    -    diagnostics: [],
    -    metadata: (recipe, deletion).merge(
    -      ruby_template_policy_report(recipe: recipe, request: request, original: original, final: final)
    -    )
    -  }
    +def generated_blocks_facts(gemspec, facts, run_options)
    +  return {} if shim_template_profile?(facts)
    +
    +  shunted = shunted_gemfile_block(gemspec, facts, run_options)
    +  shunted ? {shunted_gemfile: shunted} : {}
     end
    -
    # File 'lib/kettle/jem.rb', line 10277
    -
    -def copy_only_when_missing_template_path?(relative_path)
    -  COPY_ONLY_WHEN_MISSING_TEMPLATE_PATHS.include?(relative_path.to_s)
    -end
    +8124 +8125 +8126 +8127 +8128 +8129 +8130 +8131
    -
    - -
    - - - @@ -23683,9 +39044,9 @@ - -
    -
    +      
    # File 'lib/kettle/jem.rb', line 8124
     
    +def (group, target_parts)
    +  return false unless (target_parts)
     
    -8236
    -8237
    -8238
    -8239
    -8240
    -
    -
    # File 'lib/kettle/jem.rb', line 8236
    +  node = group.fetch(:node)
    +  return false unless node.is_a?(::Prism::StringNode)
     
    -def copyright_author_names(copyright)
    -  Array(copyright[:lines]).filter_map do |line|
    -    copyright_name_from_line(line.to_s)
    -  end
    +  %w[CHANGELOG.md LICENSE.md README.md].include?(node.unescaped.to_s)
     end
    -
    # File 'lib/kettle/jem.rb', line 8344
    -
    -def copyright_bot_entry?(entry)
    -  entry[:name].to_s.match?(BOT_NAME_SUFFIX) || entry[:email].to_s.match?(BOT_EMAIL_PATTERN)
    -end
    +13191 +13192 +13193 +13194 +13195
    -
    - -
    - - - @@ -23768,9 +39101,9 @@ @@ -23827,71 +39162,64 @@
    -
    +      
    # File 'lib/kettle/jem.rb', line 13191
     
    +def generated_kettle_config_without_templates?(config)
    +  return false unless config.is_a?(Hash)
     
    -8259
    -8260
    -8261
    -8262
    -
    -
    # File 'lib/kettle/jem.rb', line 8259
    -
    -def copyright_facts(project_root, config)
    -  lines = git_copyright_lines(project_root, copyright_machine_users(config))
    -  compact_hash(lines: lines)
    +  config["tokens"].is_a?(Hash)
     end
    -
    # File 'lib/kettle/jem.rb', line 8348
    +      
    # File 'lib/kettle/jem.rb', line 9853
     
    -def copyright_machine_user_entry?(entry, machine_users)
    -  return false if machine_users.empty?
    +def generated_or_obsolete_github_workflow?(relative_path)
    +  return true if preferred_template_source(PACKAGED_TEMPLATE_ROOT, relative_path)
    +  return true if stale_versioned_engine_workflow?(relative_path)
    +  return true if relative_path == ".github/workflows/opencollective.yml"
     
    -  machine_users.include?(entry[:name].to_s.downcase.strip) ||
    -    machine_users.include?(entry[:email].to_s.downcase.strip)
    +  OBSOLETE_GITHUB_WORKFLOWS.include?(File.basename(relative_path))
     end
    - - - - -
    -
    -
    +
    +
    + -8264 -8265 -8266 -8267
    -
    -
    # File 'lib/kettle/jem.rb', line 8264
     
    -def copyright_machine_users(config)
    -  copyright = config["copyright"].is_a?(Hash) ? config["copyright"] : {}
    -  (Array(config["machine_users"]) + Array(copyright["machine_users"])).map { |user| user.to_s.downcase.strip }.reject(&:empty?)
    -end
    -
    +
    - -
    - +
    @@ -23899,33 +39227,60 @@
     
     
    -8242
    -8243
    -8244
    -8245
    -8246
    -8247
    -8248
    -8249
    +11195 +11196 +11197 +11198 +11199 +11200 +11201 +11202 +11203
    -
    # File 'lib/kettle/jem.rb', line 8242
    +      
    # File 'lib/kettle/jem.rb', line 11195
     
    -def copyright_name_from_line(line)
    -  prefix = "Copyright (c) "
    -  return unless line.start_with?(prefix)
    +def generated_version_tree_source_url?(source_url, version)
    +  return false unless present_template_token_value?(source_url) && present_template_token_value?(version)
     
    -  tokens = line[prefix.length..].to_s.split
    -  tokens.shift while tokens.first && copyright_year_token?(tokens.first)
    -  tokens.join(" ").strip.then { |name| name unless name.empty? }
    +  uri = URI.parse(source_url.to_s)
    +  segments = uri.path.to_s.split("/").reject(&:empty?)
    +  uri.host == "github.com" && segments[2] == "tree" && segments[3] == "v#{version}"
    +rescue URI::InvalidURIError
    +  false
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -23933,9 +39288,9 @@ @@ -23986,35 +39343,58 @@
     
     
    -9576
    -9577
    -9578
    -9579
    -9580
    +8149 +8150 +8151 +8152 +8153 +8154 +8155
    -
    # File 'lib/kettle/jem.rb', line 9576
    +      
    # File 'lib/kettle/jem.rb', line 8149
     
    -def copyright_notice_lines(copyright_lines, copyright_prefix, author)
    -  lines = Array(copyright_lines)
    -  lines = ["Copyright (c) #{Time.now.utc.year} #{[author[:given_names], author[:family_names]].compact.join(" ").strip}"] if lines.empty?
    -  lines.map { |line| "#{copyright_prefix}#{line}" }
    +def generic_bundler_gemspec_files_assignment?(record)
    +  node = record.fetch(:value_node)
    +  node.is_a?(::Prism::CallNode) &&
    +    node.name == :popen &&
    +    node.receiver&.slice == "IO" &&
    +    generic_bundler_gemspec_files_command?(node.arguments&.arguments&.first)
     end
    -
    # File 'lib/kettle/jem.rb', line 8251
    +      
    # File 'lib/kettle/jem.rb', line 8157
     
    -def copyright_year_token?(token)
    -  token.delete(",-").chars.all? { |char| char.between?("0", "9") }
    +def generic_bundler_gemspec_files_command?(node)
    +  node.is_a?(::Prism::ArrayNode) &&
    +    node.elements.map { |element| ruby_static_string_value(element) } == %w[git ls-files -z]
     end
    +
    +
    + + + +
    +
    +
    + +

    Raises:

    +
      + +
    • + + + (ArgumentError) + + + +
    • + +
    + +
    @@ -24022,9 +39402,9 @@

    -

    +

     
     
    -4360
    -4361
    -4362
    -4363
    -4364
    -4365
    -4366
    -4367
    +10709 +10710 +10711 +10712 +10713 +10714 +10715 +10716 +10717 +10718 +10719 +10720 +10721 +10722 +10723 +10724 +10725 +10726 +10727 +10728 +10729 +10730

    @@ -24062,9 +39470,9 @@

    -

    +

    - .coverage_thresholds_from_workflow(project_root) ⇒ Object + .git_hooks_executable_step(project_root) ⇒ Object @@ -24076,33 +39484,51 @@

     
     
    -4303
    -4304
    -4305
    -4306
    -4307
    -4308
    -4309
    -4310
    -4311
    -4312
    -4313
    -4314
    +3670 +3671 +3672 +3673 +3674 +3675 +3676 +3677 +3678 +3679 +3680 +3681 +3682 +3683 +3684 +3685 +3686 +3687 +3688 +3689 +3690

    @@ -24110,9 +39536,9 @@

    -

    +

    - .coverage_thresholds_from_yaml_workflow(content) ⇒ Object + .git_output(project_root, *args) ⇒ Object @@ -24124,21 +39550,17 @@

     
     
    -4369
    -4370
    -4371
    -4372
    -4373
    -4374
    +9912 +9913 +9914 +9915

    @@ -24146,9 +39568,9 @@

    -

    +

    - .current_changelog_version_section(content, version) ⇒ Object + .git_preflight_report(project_root, template_selection:) ⇒ Object @@ -24160,31 +39582,31 @@

     
     
    -4432
    -4433
    -4434
    -4435
    -4436
    -4437
    -4438
    -4439
    -4440
    -4441
    -4442
    +9888 +9889 +9890 +9891 +9892 +9893 +9894 +9895 +9896 +9897 +9898

    @@ -24192,9 +39614,9 @@

    -

    +

    - .decision_policy_for(env, run_options) ⇒ Object + .git_remote_source_url(project_root) ⇒ Object @@ -24206,15 +39628,19 @@

     
     
    -7161
    -7162
    -7163
    +11924 +11925 +11926 +11927 +11928

    @@ -24222,9 +39648,9 @@

    -

    +

    - .decorative_grapheme?(grapheme) ⇒ Boolean + .git_success?(project_root, *args) ⇒ Boolean @@ -24259,23 +39685,17 @@

     
     
    -7128
    -7129
    -7130
    -7131
    -7132
    -7133
    -7134
    +9907 +9908 +9909 +9910

    @@ -24283,9 +39703,9 @@

    -

    +

    - .deduplicate_readme_top_logo_entries(entries) ⇒ Object + .git_version_file_value(project_root, relative_path) ⇒ Object @@ -24297,19 +39717,31 @@

     
     
    -9296
    -9297
    -9298
    -9299
    -9300
    +11636 +11637 +11638 +11639 +11640 +11641 +11642 +11643 +11644 +11645 +11646

    @@ -24317,9 +39749,9 @@

    -

    +

    - .deep_dup(value) ⇒ Object + .git_worktree_prefix(project_root) ⇒ Object @@ -24331,15 +39763,19 @@

     
     
    -11678
    -11679
    -11680
    +11896 +11897 +11898 +11899 +11900

    @@ -24347,9 +39783,9 @@

    -

    +

    - .deep_string_key_hash(value) ⇒ Object + .git_worktree_root(project_root) ⇒ Object @@ -24361,33 +39797,21 @@

     
     
    -2504
    -2505
    -2506
    -2507
    -2508
    -2509
    -2510
    -2511
    -2512
    -2513
    -2514
    -2515
    +11889 +11890 +11891 +11892 +11893 +11894

    @@ -24395,9 +39819,9 @@

    -

    +

    - .default_framework_matrix_requirement(version) ⇒ Object + .github_actions_coverage_config(config, env = ENV) ⇒ Object @@ -24409,19 +39833,39 @@

     
     
    -10803
    -10804
    -10805
    -10806
    -10807
    +13844 +13845 +13846 +13847 +13848 +13849 +13850 +13851 +13852 +13853 +13854 +13855 +13856 +13857 +13858

    @@ -24429,91 +39873,56 @@

    -

    +

    - .default_readme_top_logo_credit(type) ⇒ Object + .github_actions_coverage_enabled?(content) ⇒ Boolean -

     
     
    -4296
    -4297
    -4298
    -4299
    -4300
    -4301
    +10732 +10733 +10734 +10735 +10736 +10737
    -
    # File 'lib/kettle/jem.rb', line 4296
    +      
    # File 'lib/kettle/jem.rb', line 10732
     
    -def coverage_thresholds_from_mise(content)
    -  %w[K_SOUP_COV_MIN_BRANCH K_SOUP_COV_MIN_LINE].each_with_object({}) do |key, thresholds|
    -    value = toml_string_scalar_line_value(content, key)
    -    thresholds[key] = value if value
    -  end
    +def git_capture(project_root, *args)
    +  output = IO.popen(["git", "-C", project_root.to_s, *args], err: File::NULL, &:read)
    +  raise ArgumentError, "git #{args.join(" ")} failed" unless $CHILD_STATUS&.success?
    +
    +  output.to_s
     end
    -
    # File 'lib/kettle/jem.rb', line 4360
    +      
    # File 'lib/kettle/jem.rb', line 10709
     
    -def coverage_thresholds_from_project_mise(project_root)
    -  return {} if project_root.to_s.empty?
    +def git_copyright_lines(project_root, machine_users)
    +  files = git_capture(project_root, "ls-files", "-z")
    +  return [] if files.to_s.empty?
     
    -  path = File.join(project_root.to_s, "mise.toml")
    -  return {} unless File.file?(path)
    +  author_map = Hash.new { |hash, email| hash[email] = {name: nil, years: [], email: email} }
    +  files.split("\0").reject(&:empty?).each do |relative_path|
    +    next unless File.exist?(File.join(project_root, relative_path))
     
    -  coverage_thresholds_from_mise(File.read(path))
    +    parse_blame_porcelain(git_capture(project_root, "blame", "--porcelain", "--", relative_path), author_map)
    +  rescue ArgumentError
    +    next
    +  end
    +  resolve_uncommitted_author!(project_root, author_map)
    +  author_map.values
    +    .reject { |entry| copyright_bot_entry?(entry) }
    +    .reject { |entry| copyright_machine_user_entry?(entry, machine_users) }
    +    .reject { |entry| entry[:name].to_s.strip.empty? || entry[:years].empty? }
    +    .sort_by { |entry| [entry[:years].map(&:to_i).min, entry[:name].to_s.downcase] }
    +    .map { |entry| "Copyright (c) #{format_copyright_years(entry[:years])} #{entry[:name]}" }
    +rescue ArgumentError
    +  []
     end
    -
    # File 'lib/kettle/jem.rb', line 4303
    -
    -def coverage_thresholds_from_workflow(project_root)
    -  return {} if project_root.to_s.empty?
    +      
    # File 'lib/kettle/jem.rb', line 3670
     
    -  path = File.join(project_root.to_s, ".github", "workflows", "coverage.yml")
    -  return {} unless File.file?(path)
    +def git_hooks_executable_step(project_root)
    +  existing_paths = EXECUTABLE_GIT_HOOK_PATHS.select do |relative_path|
    +    File.file?(File.join(project_root.to_s, relative_path))
    +  end
    +  return {name: "git_hooks_executable", status: "missing", changed_files: []} if existing_paths.empty?
     
    -  content = File.read(path)
    -  %w[K_SOUP_COV_MIN_BRANCH K_SOUP_COV_MIN_LINE].each_with_object({}) do |key, thresholds|
    -    value = yaml_scalar_line_value(content, key)
    -    thresholds[key] = value.to_s.delete_prefix("\"").delete_suffix("\"") if value
    +  changed_files = existing_paths.filter_map do |relative_path|
    +    path = File.join(project_root.to_s, relative_path)
    +    before = File.stat(path).mode
    +    after = before | 0o111
    +    next if before == after
    +
    +    FileUtils.chmod(after, path)
    +    relative_path
       end
    +  {
    +    name: "git_hooks_executable",
    +    status: changed_files.empty? ? "already_executable" : "updated",
    +    changed_files: changed_files
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 4369
    +      
    # File 'lib/kettle/jem.rb', line 9912
     
    -def coverage_thresholds_from_yaml_workflow(content)
    -  %w[K_SOUP_COV_MIN_BRANCH K_SOUP_COV_MIN_LINE].each_with_object({}) do |key, thresholds|
    -    value = yaml_scalar_line_value(content, key)
    -    thresholds[key] = value if value
    -  end
    +def git_output(project_root, *args)
    +  stdout, _stderr, status = Open3.capture3("git", "-C", project_root.to_s, *args)
    +  status.success? ? stdout : ""
     end
    -
    # File 'lib/kettle/jem.rb', line 4432
    -
    -def current_changelog_version_section(content, version)
    -  version_text = version.to_s.strip
    -  return if version_text.empty?
    +      
    # File 'lib/kettle/jem.rb', line 9888
     
    -  lines = content.to_s.lines
    -  start_index = lines.index { |line| changelog_version_heading_line?(line, version_text) }
    -  return unless start_index
    -
    -  end_index = lines[(start_index + 1)..].to_a.index { |line| line.start_with?("## ") }
    -  lines[start_index...(end_index ? start_index + 1 + end_index : lines.length)].join
    +def git_preflight_report(project_root, template_selection:)
    +  inside = git_success?(project_root, "rev-parse", "--is-inside-work-tree")
    +  status = inside ? git_output(project_root, "status", "--porcelain") : nil
    +  dirty_entries = status.to_s.lines.map(&:chomp).reject(&:empty?)
    +  {
    +    git_repository: inside,
    +    clean_worktree: inside && dirty_entries.empty?,
    +    dirty_entries: dirty_entries,
    +    skip_commit: template_selection.fetch(:skip_commit, false)
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 7161
    +      
    # File 'lib/kettle/jem.rb', line 11924
     
    -def decision_policy_for(env, run_options)
    -  DecisionPolicy.from_env(env || {}, **(run_options || {}))
    +def git_remote_source_url(project_root)
    +  normalize_git_source_url(git_capture(project_root, "config", "--get", "remote.origin.url").strip)
    +rescue ArgumentError
    +  nil
     end
    -
    # File 'lib/kettle/jem.rb', line 7128
    -
    -def decorative_grapheme?(grapheme)
    -  value = grapheme.to_s
    -  return false if value.empty?
    -  return false if value.ascii_only?
    +      
    # File 'lib/kettle/jem.rb', line 9907
     
    -  !value.match?(/\A[[:alnum:][:space:]]\z/u)
    +def git_success?(project_root, *args)
    +  _stdout, _stderr, status = Open3.capture3("git", "-C", project_root.to_s, *args)
    +  status.success?
     end
    -
    # File 'lib/kettle/jem.rb', line 9296
    +      
    # File 'lib/kettle/jem.rb', line 11636
     
    -def deduplicate_readme_top_logo_entries(entries)
    -  entries.group_by { |entry| entry[:image_url].to_s }.values.map do |group|
    -    group.find { |entry| entry[:type] == "related_org" } || group.first
    +def git_version_file_value(project_root, relative_path)
    +  [
    +    git_output(project_root, "show", ":#{relative_path}"),
    +    git_output(project_root, "show", "HEAD:#{relative_path}")
    +  ].each do |content|
    +    version = ruby_version_constant_value(content)
    +    return version.to_s if valid_gem_version?(version)
       end
    +
    +  ""
     end
    -
    # File 'lib/kettle/jem.rb', line 11678
    +      
    # File 'lib/kettle/jem.rb', line 11896
     
    -def deep_dup(value)
    -  Marshal.load(Marshal.dump(value))
    +def git_worktree_prefix(project_root)
    +  git_capture(project_root, "rev-parse", "--show-prefix").strip
    +rescue ArgumentError
    +  ""
     end
    -
    # File 'lib/kettle/jem.rb', line 2504
    +      
    # File 'lib/kettle/jem.rb', line 11889
     
    -def deep_string_key_hash(value)
    -  case value
    -  when Hash
    -    value.each_with_object({}) do |(key, child), converted|
    -      converted[key.to_s] = deep_string_key_hash(child)
    -    end
    -  when Array
    -    value.map { |child| deep_string_key_hash(child) }
    -  else
    -    value
    -  end
    +def git_worktree_root(project_root)
    +  root = git_capture(project_root, "rev-parse", "--show-toplevel").strip
    +  root.empty? ? project_root.to_s : root
    +rescue ArgumentError
    +  project_root.to_s
     end
    -
    # File 'lib/kettle/jem.rb', line 10803
    +      
    # File 'lib/kettle/jem.rb', line 13844
     
    -def default_framework_matrix_requirement(version)
    -  normalized = version.to_s
    -  normalized = "#{normalized}.0" if normalized.match?(/\A\d+\.\d+\z/)
    -  "~> #{normalized}"
    +def github_actions_coverage_config(config, env = ENV)
    +  workflows = config["workflows"]
    +  return {} unless workflows.is_a?(Hash)
    +
    +  raw = workflows["coverage"]
    +  enabled = raw == true || (raw.is_a?(Hash) && raw.fetch("enabled", false) == true)
    +  return {} unless enabled
    +
    +  raw = {} unless raw.is_a?(Hash)
    +  {
    +    enabled: true,
    +    command: raw.fetch("command", github_actions_exec_cmd(config, env)).to_s,
    +    appraisal: raw.fetch("appraisal", "coverage").to_s
    +  }
     end
    - - - - -
    -
    -
    +
    +
    + -9378 -9379 -9380 -9381 -9382 -9383 -9384 -9385
    -
    -
    # File 'lib/kettle/jem.rb', line 9378
     
    -def default_readme_top_logo_credit(type)
    -  case type
    -  when "ruby"
    -    "Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5"
    -  else
    -    "Aboling0, CC BY-SA 4.0"
    -  end
    -end
    -
    +
    - -
    -

    +
    - .default_readme_top_logo_href(type, slug:, org:, gem_name:, repository: {}) ⇒ Object +

    Returns:

    +
      - +
    • + + + (Boolean) + + + +
    • +
    - -

    +
    @@ -24521,51 +39930,163 @@

    -

    - - .default_readme_top_logo_slug(type, org:, gem_name:, repository: {}) ⇒ Object - - - - +

    -

     
     
    -9363
    -9364
    -9365
    -9366
    -9367
    -9368
    -9369
    -9370
    -9371
    -9372
    -9373
    -9374
    -9375
    -9376
    +14486 +14487 +14488 +14489 +14490
    -
    # File 'lib/kettle/jem.rb', line 9363
    +      
    # File 'lib/kettle/jem.rb', line 14486
     
    -def default_readme_top_logo_href(type, slug:, org:, gem_name:, repository: {})
    -  case type
    -  when "related_org"
    -    "https://discord.gg/3qme4XHNKN"
    -  when "ruby"
    -    "https://ruby-toolbox.com"
    -  when "org"
    -    org.to_s.empty? ? "#{LOGOS_GALTZO_BASE_URL}/#{slug}/" : "https://github.com/#{org}"
    -  when "project"
    -    repository_project_logo_href(repository, slug: slug, org: org, gem_name: gem_name)
    -  else
    -    "#{LOGOS_GALTZO_BASE_URL}/#{slug}/"
    -  end
    +def github_actions_coverage_enabled?(content)
    +  yaml_contains_key_value?(YAML.safe_load(content.to_s, aliases: true), "K_SOUP_COV_DO", "true")
    +rescue Psych::Exception
    +  false
     end
    - - - @@ -28961,9 +44639,9 @@

    -

    +

    - .gemspec_field_receiver_and_name(field) ⇒ Object + .main_gemfile_nomono_requirement_records(content) ⇒ Object @@ -28975,21 +44653,51 @@

     
     
    -6540
    -6541
    -6542
    -6543
    -6544
    -6545
    +5704 +5705 +5706 +5707 +5708 +5709 +5710 +5711 +5712 +5713 +5714 +5715 +5716 +5717 +5718 +5719 +5720 +5721 +5722 +5723 +5724

    @@ -28997,9 +44705,9 @@

    -

    +

    - .gemspec_legacy_version_loader_block(entrypoint_require:, namespace:, min_ruby:) ⇒ Object + .main_gemfile_recording_eval_pathObject @@ -29011,73 +44719,25 @@

     
     
    -5994
    -5995
    -5996
    -5997
    -5998
    -5999
    -6000
    -6001
    -6002
    -6003
    -6004
    -6005
    -6006
    -6007
    -6008
    -6009
    -6010
    -6011
    -6012
    -6013
    -6014
    -6015
    -6016
    -6017
    -6018
    -6019
    -6020
    +6486 +6487 +6488

    -
    -
    -
    -9332
    -9333
    -9334
    -9335
    -9336
    -9337
    -9338
    -9339
    -9340
    -9341
    -9342
    -9343
    -9344
    -9345
    -
    -
    # File 'lib/kettle/jem.rb', line 9332
    -
    -def default_readme_top_logo_slug(type, org:, gem_name:, repository: {})
    -  case type
    -  when "related_org"
    -    "galtzo-floss"
    -  when "ruby"
    -    "ruby-lang"
    -  when "org"
    -    org.to_s
    -  when "project"
    -    repository_project_logo_slug(repository, org: org, gem_name: gem_name)
    -  else
    -    ""
    -  end
    +    .github_actions_coverage_steps(disabled_integrations: [])  ⇒ Object 
    +  
    +
    +  
    +
    +  
    +
    +  
    +    
    +    
    @@ -24573,9 +40094,9 @@ 

    -

    +

    - .default_template_configObject + .github_actions_custom_workflows(project_root, config = {}, opencollective_disabled: false) ⇒ Object @@ -24587,21 +40108,37 @@

     
     
    -10515
    -10516
    -10517
    -10518
    -10519
    -10520
    +9802 +9803 +9804 +9805 +9806 +9807 +9808 +9809 +9810 +9811 +9812 +9813 +9814 +9815

    @@ -24609,9 +40146,9 @@

    -

    +

    - .default_template_strategy_config(template_root, target_path) ⇒ Object + .github_actions_exec_cmd(config, env) ⇒ Object @@ -24623,31 +40160,25 @@

     
     
    -10281
    -10282
    -10283
    -10284
    -10285
    -10286
    -10287
    -10288
    -10289
    -10290
    -10291
    +13860 +13861 +13862 +13863 +13864 +13865 +13866 +13867

    @@ -24655,94 +40186,135 @@

    -

    - - .delete_file_recipe?(recipe) ⇒ Boolean +

    - + .github_actions_framework_matrix(config) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

    +
    +
    +
    +14528
    +14529
    +14530
    +14531
    +14532
    +14533
    +14534
    +14535
    +14536
    +14537
    +14538
    +14539
    +14540
    +14541
    +14542
    +14543
    +14544
    +14545
    +14546
    +14547
    +14548
    +14549
    +14550
    +14551
    +14552
    +14553
    +14554
    +14555
    +14556
    +14557
    +14558
    +14559
    +14560
    +14561
    +14562
    +14563
    +14564
    +14565
    +14566
    +14567
    +14568
    +14569
    +14570
    +14571
    +14572
    +14573
    +14574
    +14575
    +14576
    +14577
    +14578
    +14579
    +14580
    +14581
    +14582
    +14583
    +14584
    +14585
    +14586
    +14587
    +14588
    +14589
    +14590
    +14591
    +14592
    +14593
    +14594
    +14595
    +14596
    +14597
    +
    +
    # File 'lib/kettle/jem.rb', line 14528
    +
    +def github_actions_coverage_steps(disabled_integrations: [])
    +  disabled = Array(disabled_integrations).map { |name| normalize_integration_name(name) }.to_set
    +  steps = []
    +  unless disabled.include?("coveralls")
    +    steps << <<~YAML
    +      - name: Upload coverage to Coveralls
    +        if: ${{ !env.ACT }}
    +        uses: coverallsapp/github-action@5cbfd81b66ca5d10c19b062c04de0199c215fb6e # v2.3.7
    +        with:
    +          github-token: ${{ secrets.GITHUB_TOKEN }}
    +          file: coverage/lcov.info
    +          format: lcov
    +        continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
    +    YAML
    +  end
    +
    +  unless disabled.include?("qlty")
    +    steps << <<~YAML
    +      - name: Upload coverage to QLTY
    +        if: ${{ !env.ACT }}
    +        uses: qltysh/qlty-action/coverage@08a0a862c159eae9b9003081da6663d96efef637 # v2.3.0
    +        with:
    +          oidc: true
    +          files: coverage/lcov.info
    +          format: lcov
    +          skip-errors: false
    +        continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
    +    YAML
    +  end
    +
    +  unless disabled.include?("codecov")
    +    steps << <<~YAML
    +      - name: Upload coverage to CodeCov
    +        if: ${{ !env.ACT }}
    +        uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7
    +        with:
    +          use_oidc: true
    +          disable_search: true
    +          fail_ci_if_error: false
    +          files: coverage/lcov.info,coverage/coverage.xml
    +          verbose: true
    +    YAML
    +  end
    +
    +  steps << <<~YAML
    +    - name: Code Coverage Summary Report
    +      if: ${{ !env.ACT && github.event_name == 'pull_request' }}
    +      uses: irongut/CodeCoverageSummary@51cc3a756ddcd398d447c044c02cb6aa83fdae95 # v1.3.0
    +      with:
    +        filename: ./coverage/coverage.xml
    +        badge: true
    +        fail_below_min: true
    +        format: markdown
    +        hide_branch_rate: false
    +        hide_complexity: true
    +        indicators: true
    +        output: both
    +        thresholds: '${{ env.K_SOUP_COV_MIN_LINE }} ${{ env.K_SOUP_COV_MIN_BRANCH }}'
    +      continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
    +
    +    - name: Add Coverage PR Comment
    +      uses: marocchino/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88 # v3.0.5
    +      if: ${{ !env.ACT && github.event_name == 'pull_request' }}
    +      with:
    +        recreate: true
    +        path: code-coverage-results.md
    +      continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
    +  YAML
    +  steps.join("\n").lines.map { |line| line.strip.empty? ? line : "      #{line}" }.join.chomp
     end
    -
    # File 'lib/kettle/jem.rb', line 10515
    +      
    # File 'lib/kettle/jem.rb', line 9802
     
    -def default_template_config
    -  {
    -    "root" => "packaged",
    -    "apply" => true
    -  }
    +def github_actions_custom_workflows(project_root, config = {}, opencollective_disabled: false)
    +  workflow_root = File.join(project_root, ".github", "workflows")
    +  return [] unless Dir.exist?(workflow_root)
    +
    +  Dir.glob(File.join(workflow_root, "*.{yml,yaml}")).filter_map do |path|
    +    relative_path = path.delete_prefix("#{project_root}/")
    +    next if opencollective_disabled && opencollective_disabled_file?(relative_path)
    +    next if inactive_packaged_workflow?(relative_path, config)
    +    next if generated_or_obsolete_github_workflow?(relative_path) &&
    +      !skip_packaged_workflow_template?(relative_path, config)
    +
    +    relative_path
    +  end.sort
     end
    -
    # File 'lib/kettle/jem.rb', line 10281
    +      
    # File 'lib/kettle/jem.rb', line 13860
     
    -def default_template_strategy_config(template_root, target_path)
    -  return unless template_root.fetch(:kind) == "packaged"
    -  return {strategy: :merge, preference: :destination, add_template_only_nodes: true} if target_path.to_s == KETTLE_CONFIG_PATH
    -  return {strategy: :accept_template} if target_path.to_s == "CITATION.cff"
    -  return {strategy: :accept_template} if target_path.to_s == "Rakefile"
    -  return {strategy: :accept_template} if version_gem_template_target_path?(target_path)
    -  return {strategy: :accept_template} if target_path.to_s.start_with?(".github/workflows/")
    -  return {strategy: :accept_template} if target_path.to_s.start_with?("gemfiles/modular/")
    +def github_actions_exec_cmd(config, env)
    +  workflows = config["workflows"]
    +  workflows = {} unless workflows.is_a?(Hash)
     
    -  nil
    +  normalize_github_actions_exec_cmd(
    +    preferred_template_token_value("kettle-test", workflows["exec_cmd"], env, "KJ_EXEC_CMD").to_s
    +  )
     end
    +
    - + - -
     
     
    -7606
    -7607
    -7608
    -
    -
    # File 'lib/kettle/jem.rb', line 7606
    +13708
    +13709
    +13710
    +13711
    +13712
    +13713
    +13714
    +13715
    +13716
    +13717
    +13718
    +13719
    +13720
    +13721
    +13722
    +13723
    +13724
    +13725
    +13726
    +13727
    +13728
    +13729
    +13730
    +13731
    +13732
    +13733
    +13734
    +13735
    +13736
    +13737
    +13738
    +13739
    +13740
    +13741
    +13742
    +13743
    +13744
    +13745
    +13746
    +13747
    +13748
    +13749
    +13750
    +13751
    +13752
    +13753
    +13754
    +13755
    +13756
    +13757
    +13758
    +13759
    +13760
    +13761
    +13762
    +13763
    +
    +
    # File 'lib/kettle/jem.rb', line 13708
     
    -def delete_file_recipe?(recipe)
    -  FILE_DELETION_PRIMITIVES.include?(recipe.fetch(:primitive))
    -end
    -
    - - -
    -

    - - .delete_line_ranges(content, selectors) ⇒ Object - +def github_actions_framework_matrix(config) + workflows = config["workflows"] + return {} unless workflows.is_a?(Hash) && workflows["preset"].to_s.strip.downcase == "framework" - + raw = workflows["framework_matrix"] + return {} unless raw.is_a?(Hash) - -

    - - - @@ -24750,9 +40322,9 @@

    -

    +

    - .delete_markdown_with_ast_crispr(content, target) ⇒ Object + .github_actions_obsolete_workflows(project_root) ⇒ Object @@ -24764,15 +40336,25 @@

     
     
    -4615
    -4616
    -4617
    +9836 +9837 +9838 +9839 +9840 +9841 +9842 +9843

    @@ -24780,9 +40362,9 @@

    -

    +

    - .delete_rakefile_scaffold(content) ⇒ Object + .github_actions_pin_sync_step(project_root) ⇒ Object @@ -24794,26 +40376,44 @@

     
     
    -10954
    -10955
    -10956
    -10957
    -10958
    -10959
    -10960
    -10961
    -10962
    +3692 +3693 +3694 +3695 +3696 +3697 +3698 +3699 +3700 +3701 +3702 +3703 +3704 +3705 +3706 +3707 +3708 +3709

    @@ -24822,9 +40422,9 @@

    -

    +

    - .detected_license_ids(project_root) ⇒ Object + .github_actions_push_branches(content, default_branch:) ⇒ Object @@ -24836,21 +40436,19 @@

     
     
    -3314
    -3315
    -3316
    -3317
    -3318
    -3319
    +14461 +14462 +14463 +14464 +14465

    @@ -24858,494 +40456,87 @@

    -

    - - .discover_facts(project_root, env: ENV, run_options: {}) ⇒ Object +

    - + .github_actions_push_branches_yaml(content, default_branch:, indent: " ") ⇒ Object -

    -
    - - -
    -
    -
    - -

    Raises:

    -
      - -
    • - - - (ArgumentError) - - - -
    • -
    - -

    -
    +  dimension = raw["dimension"].to_s.strip
    +  versions = raw["versions"]
    +  pattern = raw["gemfile_pattern"].to_s.strip
    +  return {} unless !dimension.empty? && versions.is_a?(Array) && !versions.empty? && !pattern.empty?
     
    +  framework_gem = raw.fetch("gem", dimension).to_s.strip
    +  return {} if framework_gem.empty?
     
    -11092
    -11093
    -11094
    -11095
    -11096
    -11097
    -11098
    -11099
    -11100
    -
    -
    # File 'lib/kettle/jem.rb', line 11092
    +  version_entries = versions.filter_map { |version| framework_matrix_version_entry(version) }
    +  return {} if version_entries.empty?
     
    -def delete_line_ranges(content, selectors)
    -  lines = content.lines
    -  selectors.sort_by { |selector| -selector.fetch(:start_line) }.each do |selector|
    -    start_index = selector.fetch(:start_line) - 1
    -    end_index = selector.fetch(:end_line) - 1
    -    lines.slice!(start_index..end_index)
    -  end
    -  lines.join.gsub(/\n{3,}/, "\n\n")
    +  appraisal_gemfiles = framework_matrix_appraisal_gemfiles(raw)
    +  gemfiles = version_entries.map do |entry|
    +    gemfile = expand_framework_gemfile_pattern(pattern, entry.fetch(:slug))
    +    {
    +      path: framework_gemfile_path(gemfile),
    +      gem: framework_gem,
    +      requirement: entry.fetch(:requirement),
    +      env: entry.fetch(:env, {})
    +    }
    +  end.uniq { |entry| entry.fetch(:path) }
    +  gemfiles.reject! { |entry| template_keep_destination_path?(config, entry.fetch(:path)) }
    +  {
    +    dimension: dimension,
    +    gem: framework_gem,
    +    workflow: framework_matrix_workflow_enabled?(raw),
    +    versions: version_entries.map { |entry| entry.fetch(:label) },
    +    gemfile_pattern: pattern,
    +    include: version_entries.map do |entry|
    +      {
    +        framework_version: entry.fetch(:label),
    +        appraisal: entry[:appraisal_name] || framework_matrix_appraisal_name(dimension, entry.fetch(:slug))
    +      }
    +    end,
    +    gemfiles: gemfiles,
    +    appraisals: version_entries.map do |entry|
    +      gemfile = framework_gemfile_path(expand_framework_gemfile_pattern(pattern, entry.fetch(:slug)))
    +      name = entry[:appraisal_name] || framework_matrix_appraisal_name(dimension, entry.fetch(:slug))
    +      {
    +        name: name,
    +        framework_version: entry.fetch(:label),
    +        gem: framework_gem,
    +        env: entry.fetch(:env, {}),
    +        eval_gemfiles: [framework_matrix_appraisal_gemfile_path(gemfile), *appraisal_gemfiles].uniq,
    +        replaces: framework_matrix_replaced_appraisal_names(dimension, entry, name)
    +      }
    +    end
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 4615
    +      
    # File 'lib/kettle/jem.rb', line 9836
     
    -def delete_markdown_with_ast_crispr(content, target)
    -  Ast::Crispr::Delete.call(content: content.to_s, target: target, source_label: "README.md").updated_content
    +def github_actions_obsolete_workflows(project_root)
    +  workflow_root = File.join(project_root, ".github", "workflows")
    +  OBSOLETE_GITHUB_WORKFLOWS.filter_map do |workflow|
    +    relative_path = ".github/workflows/#{workflow}"
    +    path = File.join(workflow_root, workflow)
    +    relative_path if File.exist?(path)
    +  end.sort
     end
    -
    # File 'lib/kettle/jem.rb', line 10954
    +      
    # File 'lib/kettle/jem.rb', line 3692
     
    -def delete_rakefile_scaffold(content)
    -  selectors = rakefile_scaffold_delete_selectors(content)
    -  return {content: content.to_s, delete_selectors: selectors} if selectors.empty?
    +def github_actions_pin_sync_step(project_root)
    +  workflow_root = File.join(project_root.to_s, ".github", "workflows")
    +  return unless File.directory?(workflow_root)
    +
    +  changed_files = Dir[File.join(workflow_root, "*.{yml,yaml}")].sort.filter_map do |path|
    +    before = File.read(path)
    +    after = update_github_actions_pins(before)
    +    next if after == before
     
    +    File.write(path, after)
    +    path.delete_prefix("#{project_root}/")
    +  end
       {
    -    content: delete_line_ranges(content.to_s, selectors),
    -    delete_selectors: selectors
    +    name: "github_actions_pin_sync",
    +    status: changed_files.empty? ? "already_current" : "applied",
    +    changed_files: changed_files
       }
     end
    -
    # File 'lib/kettle/jem.rb', line 3314
    +      
    # File 'lib/kettle/jem.rb', line 14461
     
    -def detected_license_ids(project_root)
    -  known_license_template_basenames.filter_map do |basename|
    -    path = File.join(project_root.to_s, "#{basename}.md")
    -    File.exist?(path) ? spdx_from_basename(basename) : nil
    -  end.sort
    +def github_actions_push_branches(content, default_branch:)
    +  managed = [default_branch.to_s, "*-stable"]
    +  existing = yaml_scalar_sequence_at_path(content, %w[on push branches])
    +  (managed + existing).uniq
     end
    +
    + +
     
     
    -2604
    -2605
    -2606
    -2607
    -2608
    -2609
    -2610
    -2611
    -2612
    -2613
    -2614
    -2615
    -2616
    -2617
    -2618
    -2619
    -2620
    -2621
    -2622
    -2623
    -2624
    -2625
    -2626
    -2627
    -2628
    -2629
    -2630
    -2631
    -2632
    -2633
    -2634
    -2635
    -2636
    -2637
    -2638
    -2639
    -2640
    -2641
    -2642
    -2643
    -2644
    -2645
    -2646
    -2647
    -2648
    -2649
    -2650
    -2651
    -2652
    -2653
    -2654
    -2655
    -2656
    -2657
    -2658
    -2659
    -2660
    -2661
    -2662
    -2663
    -2664
    -2665
    -2666
    -2667
    -2668
    -2669
    -2670
    -2671
    -2672
    -2673
    -2674
    -2675
    -2676
    -2677
    -2678
    -2679
    -2680
    -2681
    -2682
    -2683
    -2684
    -2685
    -2686
    -2687
    -2688
    -2689
    -2690
    -2691
    -2692
    -2693
    -2694
    -2695
    -2696
    -2697
    -2698
    -2699
    -2700
    -2701
    -2702
    -2703
    -2704
    -2705
    -2706
    -2707
    -2708
    -2709
    -2710
    -2711
    -2712
    -2713
    -2714
    -2715
    -2716
    -2717
    -2718
    -2719
    -2720
    -2721
    -2722
    -2723
    -2724
    -2725
    -2726
    -2727
    -2728
    -2729
    -2730
    -2731
    -2732
    -2733
    -2734
    -2735
    -2736
    -2737
    -2738
    -2739
    -2740
    -2741
    -2742
    -2743
    -2744
    -2745
    -2746
    -2747
    -2748
    -2749
    -2750
    -2751
    -2752
    -2753
    -2754
    -2755
    -2756
    -2757
    -2758
    -2759
    -2760
    -2761
    -2762
    -2763
    -2764
    -2765
    -2766
    -2767
    -2768
    -2769
    -2770
    -2771
    -2772
    -2773
    -2774
    -2775
    -2776
    -2777
    -2778
    -2779
    -2780
    -2781
    -2782
    -2783
    -2784
    -2785
    -2786
    -2787
    -2788
    -2789
    -2790
    -2791
    -2792
    -2793
    -2794
    -2795
    -2796
    -2797
    -2798
    -2799
    -2800
    -2801
    -2802
    -2803
    -2804
    -2805
    -2806
    -2807
    -2808
    -2809
    -2810
    -2811
    -2812
    -2813
    -2814
    -2815
    -2816
    -2817
    -2818
    -2819
    -2820
    -2821
    -2822
    -2823
    -2824
    -2825
    -2826
    -2827
    +14455 +14456 +14457 +14458 +14459
    -
    # File 'lib/kettle/jem.rb', line 2604
    +      
    # File 'lib/kettle/jem.rb', line 14455
     
    -def discover_facts(project_root, env: ENV, run_options: {})
    -  kettle_config = kettle_jem_config(project_root)
    -  template_selection = template_selection_for(env, run_options)
    -  configured_template_profile = normalize_template_profile(kettle_config.dig("templates", "profile"))
    -  if template_selection[:template_profile].to_s.empty? && !configured_template_profile.empty?
    -    template_selection[:template_profile] = configured_template_profile
    -  end
    -  gemspec_path = Dir.glob(File.join(project_root, "*.gemspec")).min
    -  if !gemspec_path && template_selection[:template_profile].to_s == MONOREPO_ROOT_TEMPLATE_PROFILE
    -    return discover_monorepo_root_facts(project_root, kettle_config, env, template_selection)
    -  end
    -  raise ArgumentError, "no gemspec found in #{project_root}" unless gemspec_path
    +def github_actions_push_branches_yaml(content, default_branch:, indent: "              ")
    +  github_actions_push_branches(content, default_branch: default_branch).map do |branch|
    +    "#{indent}- #{branch.inspect}"
    +  end.join("\n")
    +end
    +
    +
    + +
    +

    + + .github_actions_rspec_status_cache_step(cache_scope:, key_parts:, indent:, if_condition: "${{!env.ACT}}") ⇒ Object + - gemspec_spec = load_project_gemspec(gemspec_path) - = (project_root, gemspec_path, spec: gemspec_spec) - name = (, :gem_name) || - File.basename(gemspec_path, ".gemspec") - homepage_url = (, :homepage) - = (, :source_code_uri) - unless (File.read(gemspec_path), "source_code_uri") - = nil if generated_version_tree_source_url?(, (, :version)) - end - = concrete_github_url() - homepage_github_url = concrete_github_url(homepage_url) - git_source_url = git_remote_source_url(project_root) - git_github_url = concrete_github_url(git_source_url) - source_url = || - homepage_github_url || - git_github_url || - || - homepage_url || - git_source_url - derived_github_user = (git_github_url && source_url == git_github_url) ? github_org_from_url(git_github_url) : nil - rubygems_config = kettle_config["rubygems"].is_a?(Hash) ? kettle_config["rubygems"] : {} - entrypoint_require = rubygems_config["entrypoint_require"].to_s.strip - entrypoint_require = (, :entrypoint_require) if entrypoint_require.empty? - entrypoint_require = name.tr("-", "/") if entrypoint_require.to_s.empty? - version_path = File.join("lib", entrypoint_require, "version.rb") - entrypoint_path = File.join("lib", "#{entrypoint_require}.rb") - configured_namespace = rubygems_config["namespace"].to_s.strip - namespace = configured_namespace.empty? ? nil : configured_namespace - namespace ||= existing_entrypoint_version_namespace(project_root, entrypoint_path) || - existing_version_namespace(project_root, version_path) || - (, :namespace) || - classify_namespace(name) - project_version = (, :version) - project_version = existing_version_file_value(project_root, version_path) unless valid_gem_version?(project_version) - configured_min_ruby = rubygems_config["min_ruby"].to_s.strip - min_ruby = (configured_min_ruby.empty? ? nil : configured_min_ruby) || - (, :required_ruby_version) || - (, :min_ruby) - gemspec_licenses = Array([:licenses]) + - copyright = copyright_facts(project_root, kettle_config) - author = author_facts(kettle_config, env, gemspec_metadata: , copyright: copyright) - license = license_facts( - kettle_config, - gemspec_licenses, - author: author, - author_email: author[:email], - copyright: copyright - ) - gemspec_license_spdx = gemspec_licenses - .map { |license_id| license_id.to_s.strip } - .reject(&:empty?) - project_runtime = project_runtime_facts( - kettle_config, - env, - package_name: name, - source_url: source_url, - author_domain: author[:domain], - min_ruby: min_ruby, - test_min_ruby: config_test_min_ruby(kettle_config, min_ruby), - version: project_version - ) - facts = { - package: compact_hash( - ecosystem: "rubygems", - name: name, - slug: name, - summary: (, :summary), - description: (, :description) || - (, :summary), - homepage_url: homepage_url, - source_url: source_url, - license_expression: license[:expression] - ), - rubygems: compact_hash( - gemspec_path: File.basename(gemspec_path), - entrypoint_require: entrypoint_require, - namespace: namespace, - min_ruby: min_ruby, - engines: ruby_engines_config(kettle_config) - ) - } - repository_topology = repository_topology_for(kettle_config, env, template_selection) - repository = repository_facts( - project_root, - source_url, - package_name: name, - repository_topology: repository_topology - ) - facts[:repository] = repository unless repository.empty? - generated_blocks = generated_blocks_facts(, facts, run_options) - facts[:generated_blocks] = generated_blocks unless generated_blocks.empty? - bootstrap = kettle_config_bootstrap_facts(project_root, env, template_selection: template_selection) - if bootstrap - min_ruby_token = minimum_ruby_token(min_ruby) - bootstrap[:licenses] = gemspec_license_spdx unless gemspec_license_spdx.empty? - bootstrap[:gemspec_path] = File.basename(gemspec_path) if gemspec_path - bootstrap[:min_ruby] = min_ruby_token unless min_ruby_token.empty? - bootstrap[:test_min_ruby] = config_test_min_ruby(kettle_config, min_ruby).to_s - project_emoji = preferred_template_token_value(nil, nil, env, "KJ_PROJECT_EMOJI") - project_emoji ||= readme_project_emoji(project_root) - project_emoji ||= gemspec_project_emoji() - project_emoji ||= "💎" if monorepo_subgem_template_profile_value?(template_selection[:template_profile]) - bootstrap[:project_emoji] = project_emoji - end - facts[:kettle_config_bootstrap] = bootstrap if bootstrap - facts[:author] = author unless author.empty? - facts[:copyright] = copyright unless copyright.empty? - forge = forge_facts(kettle_config, env, derived_github_user: derived_github_user) - facts[:forge] = forge unless forge.empty? - social = social_facts(kettle_config, env) - facts[:social] = social unless social.empty? - opencollective_policy = opencollective_policy(kettle_config, env) - opencollective_disabled = opencollective_policy.fetch(:disabled) - open_collective_org = opencollective_org(project_root, kettle_config, env, opencollective_disabled: opencollective_disabled) - if !opencollective_disabled && open_collective_org.nil? - opencollective_disabled = true - opencollective_policy = {disabled: true, source: "missing.open_collective_org", value: ""} - end - funding = compact_hash( - urls: funding_urls( - project_root, - name, - funding_uri: (, :funding_uri), - opencollective_disabled: opencollective_disabled, - open_collective_org: open_collective_org && open_collective_org.fetch(:org) - ) - ) - funding_tokens = funding_platform_token_facts(kettle_config, env) - funding[:platform_tokens] = funding_tokens unless funding_tokens.empty? - funding[:open_collective_disabled] = true if opencollective_disabled - funding[:open_collective_disabled_source] = opencollective_policy[:source] if opencollective_disabled - if open_collective_org - unless open_collective_org.fetch(:source) == ".github/FUNDING.yml" - funding[:open_collective_org] = open_collective_org.fetch(:org) - funding[:open_collective_org_source] = open_collective_org.fetch(:source) - end - end - open_collective_files = opencollective_disabled ? opencollective_disabled_files(project_root) : [] - funding[:open_collective_files] = open_collective_files unless open_collective_files.empty? - facts[:funding] = funding unless funding.empty? - opt_in_workflows = opt_in_workflow_cleanup_files(project_root, template_selection) - template_config = template_runtime_config(kettle_config, facts, license: license) - inactive_workflows = inactive_packaged_workflow_cleanup_files( - project_root, - template_config, - include_patterns: template_selection[:include] - ) - inactive_templates = inactive_packaged_template_cleanup_files(project_root, template_config) - facts[:template_profile] = template_selection[:template_profile] unless template_selection[:template_profile].to_s.empty? - facts[:ci] = { - provider: "github_actions", - default_branch: "main", - exec_cmd: github_actions_exec_cmd(kettle_config, env), - recording: appraisal_recording_enabled?(kettle_config), - ruby_versions: github_actions_ruby_versions(project_runtime.fetch(:test_min_ruby)), - test_min_ruby: project_runtime.fetch(:test_min_ruby).to_s, - obsolete_workflows: github_actions_obsolete_workflows(project_root), - custom_workflows: github_actions_custom_workflows(project_root, template_config, opencollective_disabled: opencollective_disabled) - } - standard_appraisal_gemfiles = github_actions_standard_appraisal_gemfiles(kettle_config) - facts[:ci][:standard_appraisal_gemfiles] = standard_appraisal_gemfiles unless standard_appraisal_gemfiles.empty? - facts[:ci][:opt_in_workflow_cleanups] = opt_in_workflows unless opt_in_workflows.empty? - facts[:ci][:inactive_packaged_workflow_cleanups] = inactive_workflows unless inactive_workflows.empty? - coverage_config = github_actions_coverage_config(kettle_config, env) - facts[:ci][:coverage] = coverage_config unless coverage_config.empty? - framework_matrix = github_actions_framework_matrix(kettle_config) - facts[:ci][:framework_matrix] = framework_matrix unless framework_matrix.empty? - template_facts = {} - template_preferences = template_source_preferences( - project_root, - template_config, - opencollective_disabled: opencollective_disabled, - include_patterns: template_selection[:include] - ) - template_facts[:source_preferences] = template_preferences unless template_preferences.empty? - template_facts[:inactive_packaged_template_cleanups] = inactive_templates unless inactive_templates.empty? - legacy_cleanups = template_legacy_destination_cleanups(project_root, template_preferences) - template_facts[:legacy_destination_cleanups] = legacy_cleanups unless legacy_cleanups.empty? - license_cleanups = template_obsolete_license_cleanups(project_root, template_config, template_preferences) - template_facts[:obsolete_license_cleanups] = license_cleanups unless license_cleanups.empty? - unless template_preferences.empty? - facts[:license] = license unless license.empty? - facts[:project_runtime] = project_runtime unless project_runtime.empty? - readme_github_org = project_runtime[:github_org].to_s - readme_github_org = forge[:gh_user].to_s if readme_github_org.empty? - readme_github_org = facts.fetch(:repository, {})[:slug].to_s.split("/", 2).first.to_s if readme_github_org.empty? - = readme_logo_facts( - kettle_config, - package_name: name, - github_org: readme_github_org, - repository: facts[:repository] - ) - facts[:readme_logo] = unless .empty? - readme_style = readme_style_facts( - project_root, - kettle_config, - license, - template_profile: template_selection[:template_profile], - repository: facts[:repository] - ) - facts[:readme_style] = readme_style unless readme_style.empty? - template_tokens = template_tokens(facts, funding) - template_facts[:tokens] = template_tokens unless template_tokens.empty? - end - if template_facts[:tokens].to_h.empty? && funding[:open_collective_org].to_s != "" - template_facts[:tokens] = {"KJ|OPENCOLLECTIVE_ORG" => funding.fetch(:open_collective_org).to_s} - end - facts[:templates] = template_facts unless template_facts.empty? - facts + +

    + + + @@ -25353,9 +40544,9 @@

    -

    +

    - .discover_monorepo_root_facts(project_root, kettle_config, env, template_selection) ⇒ Object + .github_actions_ruby_versions(min_ruby) ⇒ Object @@ -25367,181 +40558,21 @@

     
     
    -2517
    -2518
    -2519
    -2520
    -2521
    -2522
    -2523
    -2524
    -2525
    -2526
    -2527
    -2528
    -2529
    -2530
    -2531
    -2532
    -2533
    -2534
    -2535
    -2536
    -2537
    -2538
    -2539
    -2540
    -2541
    -2542
    -2543
    -2544
    -2545
    -2546
    -2547
    -2548
    -2549
    -2550
    -2551
    -2552
    -2553
    -2554
    -2555
    -2556
    -2557
    -2558
    -2559
    -2560
    -2561
    -2562
    -2563
    -2564
    -2565
    -2566
    -2567
    -2568
    -2569
    -2570
    -2571
    -2572
    -2573
    -2574
    -2575
    -2576
    -2577
    -2578
    -2579
    -2580
    -2581
    -2582
    -2583
    -2584
    -2585
    -2586
    -2587
    -2588
    -2589
    -2590
    -2591
    -2592
    -2593
    -2594
    -2595
    -2596
    -2597
    -2598
    -2599
    -2600
    -2601
    -2602
    +9795 +9796 +9797 +9798 +9799 +9800

    @@ -25549,9 +40580,9 @@

    -

    +

    - .display_path(path) ⇒ Object + .github_actions_setup_ruby_steps(indent:) ⇒ Object @@ -25563,19 +40594,45 @@

     
     
    -1926
    -1927
    -1928
    -1929
    -1930
    +14289 +14290 +14291 +14292 +14293 +14294 +14295 +14296 +14297 +14298 +14299 +14300 +14301 +14302 +14303 +14304 +14305 +14306

    @@ -25583,9 +40640,9 @@

    -

    +

    - .display_text(text) ⇒ Object + .github_actions_standard_appraisal_gemfiles(config) ⇒ Object @@ -25597,19 +40654,41 @@

     
     
    -1932
    -1933
    -1934
    -1935
    -1936
    +13896 +13897 +13898 +13899 +13900 +13901 +13902 +13903 +13904 +13905 +13906 +13907 +13908 +13909 +13910 +13911

    @@ -25617,9 +40696,9 @@

    -

    +

    - .dotenv_merge_options(recipe) ⇒ Object + .github_actions_step_pinsObject @@ -25631,33 +40710,51 @@

     
     
    -5772
    -5773
    -5774
    -5775
    -5776
    -5777
    -5778
    -5779
    -5780
    -5781
    -5782
    -5783
    +14837 +14838 +14839 +14840 +14841 +14842 +14843 +14844 +14845 +14846 +14847 +14848 +14849 +14850 +14851 +14852 +14853 +14854 +14855 +14856 +14857

    @@ -25665,9 +40762,9 @@

    -

    +

    - .duplicate_drift_report(project_root:, template_root:, run_options: {}) ⇒ Object + .github_funding_platform_urls(platform, values) ⇒ Object @@ -25679,84 +40776,226 @@

     
     
    -3385
    -3386
    -3387
    -3388
    -3389
    -3390
    -3391
    -3392
    -3393
    -3394
    -3395
    -3396
    -3397
    -3398
    -3399
    -3400
    -3401
    -3402
    -3403
    -3404
    -3405
    -3406
    -3407
    -3408
    -3409
    -3410
    -3411
    -3412
    -3413
    -3414
    -3415
    -3416
    -3417
    -3418
    -3419
    -3420
    -3421
    -3422
    +9769 +9770 +9771 +9772 +9773 +9774 +9775 +9776 +9777 +9778 +9779 +9780 +9781 +9782 +9783 +9784 +9785 +9786 +9787 +9788 +9789 +9790 +9791 +9792 +9793

    + +
    +
    +
    +
    +14308
    +14309
    +14310
    +14311
    +14312
    +14313
    +14314
    +14315
    +14316
    +14317
    +14318
    +14319
    +14320
    +14321
    +14322
    +
    +
    # File 'lib/kettle/jem.rb', line 14308
    +
    +def github_actions_rspec_status_cache_step(cache_scope:, key_parts:, indent:, if_condition: "${{!env.ACT}}")
    +  cache_prefix = ["rspec-status", cache_scope, *key_parts].join("-")
    +  yaml = <<~YAML
    +    - name: Restore RSpec status log
    +      if: #{if_condition}
    +      uses: #{github_actions_step_pins.fetch("actions/cache")}
    +      with:
    +        path: .rspec_status
    +        key: #{cache_prefix}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-${{github.run_id}}-${{github.run_attempt}}
    +        restore-keys: |
    +          #{cache_prefix}-${{hashFiles('**/Gemfile.lock','Appraisal.root.gemfile','gemfiles/**/*.gemfile')}}-
    +          #{cache_prefix}-
    +  YAML
    +  yaml.lines.map { |line| line.strip.empty? ? line : "#{indent}#{line}" }.join.rstrip
     end
    -
    # File 'lib/kettle/jem.rb', line 2517
    +      
    # File 'lib/kettle/jem.rb', line 9795
     
    -def discover_monorepo_root_facts(project_root, kettle_config, env, template_selection)
    -  source_url = git_remote_source_url(project_root)
    -  package_name = repository_name_from_source_url(source_url)
    -  package_name = File.basename(project_root.to_s) if package_name.empty?
    -  configured_or_detected_licenses = detected_license_ids(project_root)
    -  configured_or_detected_licenses = Array(kettle_config["licenses"]) if configured_or_detected_licenses.empty?
    -  copyright = copyright_facts(project_root, kettle_config)
    -  author = author_facts(kettle_config, env, copyright: copyright)
    -  license = license_facts(kettle_config.merge("licenses" => configured_or_detected_licenses), configured_or_detected_licenses, author: author, author_email: author[:email], copyright: copyright)
    -  test_min_ruby = config_test_min_ruby(kettle_config, nil)
    -  project_runtime = project_runtime_facts(
    -    kettle_config,
    -    env,
    -    package_name: package_name,
    -    source_url: source_url,
    -    author_domain: author[:domain],
    -    min_ruby: nil,
    -    test_min_ruby: test_min_ruby,
    -    version: nil
    -  )
    -  facts = {
    -    package: compact_hash(
    -      ecosystem: "monorepo",
    -      name: package_name,
    -      slug: package_name,
    -      description: "#{package_name} monorepo",
    -      homepage_url: source_url,
    -      source_url: source_url,
    -      license_expression: license[:expression]
    -    ),
    -    rubygems: compact_hash(
    -      namespace: classify_namespace(package_name),
    -      min_ruby: nil,
    -      engines: ruby_engines_config(kettle_config)
    -    ),
    -    template_profile: MONOREPO_ROOT_TEMPLATE_PROFILE
    -  }
    -  bootstrap = kettle_config_bootstrap_facts(project_root, env, template_selection: template_selection)
    -  bootstrap[:licenses] = configured_or_detected_licenses if bootstrap && !configured_or_detected_licenses.empty?
    -  facts[:kettle_config_bootstrap] = bootstrap if bootstrap
    -  facts[:author] = author unless author.empty?
    -  facts[:copyright] = copyright unless copyright.empty?
    -  forge = forge_facts(kettle_config, env, derived_github_user: nil)
    -  social = social_facts(kettle_config, env)
    -  facts[:forge] = forge unless forge.empty?
    -  facts[:social] = social unless social.empty?
    -  facts[:license] = license unless license.empty?
    -  facts[:project_runtime] = project_runtime unless project_runtime.empty?
    -  funding = compact_hash(
    -    urls: funding_urls(project_root, package_name, opencollective_disabled: false),
    -    platform_tokens: funding_platform_token_facts(kettle_config, env)
    -  )
    -  detected_open_collective_org = opencollective_org(project_root, kettle_config, env, opencollective_disabled: false)
    -  if detected_open_collective_org
    -    funding[:open_collective_org] = detected_open_collective_org.fetch(:org)
    -    funding[:open_collective_org_source] = detected_open_collective_org.fetch(:source)
    -  end
    -  facts[:funding] = funding unless funding.empty?
    -  repository = repository_facts(
    -    project_root,
    -    source_url,
    -    package_name: package_name,
    -    repository_topology: REPOSITORY_TOPOLOGY_STANDALONE
    -  )
    -  facts[:repository] = repository unless repository.empty?
    -   = readme_logo_facts(
    -    kettle_config,
    -    package_name: package_name,
    -    github_org: project_runtime[:github_org],
    -    repository: facts[:repository]
    -  )
    -  facts[:readme_logo] =  unless .empty?
    -  template_facts = {}
    -  template_config = template_runtime_config(kettle_config, facts, license: license)
    -  template_preferences = template_source_preferences(
    -    project_root,
    -    template_config,
    -    opencollective_disabled: false,
    -    include_patterns: template_selection[:include]
    -  )
    -  template_facts[:source_preferences] = template_preferences unless template_preferences.empty?
    -  template_tokens = template_tokens(facts, funding)
    -  template_facts[:tokens] = template_tokens unless template_tokens.empty?
    -  facts[:templates] = template_facts unless template_facts.empty?
    -  facts
    +def github_actions_ruby_versions(min_ruby)
    +  floor = min_ruby.to_s[/\d+\.\d+/] || "3.1"
    +  candidates = %w[3.1 3.2 3.3 3.4]
    +  selected = candidates.select { |version| Gem::Version.new(version) >= Gem::Version.new(floor) }
    +  selected.empty? ? [floor] : selected
     end
    -
    # File 'lib/kettle/jem.rb', line 1926
    +      
    # File 'lib/kettle/jem.rb', line 14289
     
    -def display_path(path)
    -  return path if path.nil?
    -
    -  path.to_s.sub(VAR_HOME_PREFIX, "/home")
    +def github_actions_setup_ruby_steps(indent:)
    +  yaml = <<~YAML
    +    - name: Setup Ruby & RubyGems
    +      uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0
    +      with:
    +        ruby-version: "${{ matrix.ruby }}"
    +        rubygems: "${{ matrix.rubygems }}"
    +        bundler: "${{ matrix.bundler }}"
    +        bundler-cache: ${{ matrix.ruby != 'truffleruby-25.0' && matrix.ruby != 'jruby-9.2' && matrix.ruby != 'jruby-9.3' }}
    +
    +    - name: Bundle install for legacy Ruby engine
    +      if: ${{ matrix.ruby == 'truffleruby-25.0' || matrix.ruby == 'jruby-9.2' || matrix.ruby == 'jruby-9.3' }}
    +      run: |
    +        bundle config set --local path "${RUNNER_TEMP}/bundle"
    +        bundle install --jobs 1
    +  YAML
    +  yaml.lines.map { |line| line.strip.empty? ? line : "#{indent}#{line}" }.join.rstrip
     end
    -
    # File 'lib/kettle/jem.rb', line 1932
    +      
    # File 'lib/kettle/jem.rb', line 13896
     
    -def display_text(text)
    -  return text if text.nil?
    +def github_actions_standard_appraisal_gemfiles(config)
    +  workflows = config["workflows"]
    +  workflows = {} unless workflows.is_a?(Hash)
    +  appraisal_matrix = config["appraisal_matrix"]
    +  appraisal_matrix = {} unless appraisal_matrix.is_a?(Hash)
     
    -  text.to_s.gsub(VAR_HOME_TEXT, "/home")
    +  raw_paths =
    +    workflows["standard_appraisal_gemfiles"] ||
    +    appraisal_matrix["appraisal_gemfiles"] ||
    +    appraisal_matrix["appraisal_eval_gemfiles"]
    +
    +  Array(raw_paths).filter_map do |path|
    +    normalized = path.to_s.strip.sub(%r{\Agemfiles/}, "")
    +    normalized unless normalized.empty?
    +  end.uniq
     end
    -
    # File 'lib/kettle/jem.rb', line 5772
    +      
    # File 'lib/kettle/jem.rb', line 14837
     
    -def dotenv_merge_options(recipe)
    -  options = {
    -    preference: (recipe.dig(:template_preference, :preference) || "destination").to_sym,
    -    add_template_only_nodes: true,
    -    freeze_token: recipe.dig(:template_preference, :freeze_token) || "kettle-jem"
    +def github_actions_step_pins
    +  {
    +    "actions/checkout" => "actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0",
    +    "actions/cache" => "actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0",
    +    "ruby/setup-ruby" => "ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0",
    +    "coverallsapp/github-action" => "coverallsapp/github-action@5cbfd81b66ca5d10c19b062c04de0199c215fb6e # v2.3.7",
    +    "qltysh/qlty-action/coverage" => "qltysh/qlty-action/coverage@08a0a862c159eae9b9003081da6663d96efef637 # v2.3.0",
    +    "codecov/codecov-action" => "codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7",
    +    "irongut/CodeCoverageSummary" => "irongut/CodeCoverageSummary@51cc3a756ddcd398d447c044c02cb6aa83fdae95 # v1.3.0",
    +    "marocchino/sticky-pull-request-comment" => "marocchino/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88 # v3.0.5",
    +    "actions/upload-artifact" => "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1",
    +    "amancevice/setup-code-climate" => "amancevice/setup-code-climate@0daf2985a225e8ac15975b4d233010e94d65b76a # v2",
    +    "actions/dependency-review-action" => "actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0",
    +    "github/codeql-action/init" => "github/codeql-action/init@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1",
    +    "github/codeql-action/autobuild" => "github/codeql-action/autobuild@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1",
    +    "github/codeql-action/analyze" => "github/codeql-action/analyze@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1",
    +    "pozil/auto-assign-issue" => "pozil/auto-assign-issue@af6beea6bdf1e8eb373f061c5bc168681fc6d011 # v4.0.1",
    +    "apache/skywalking-eyes/dependency" => "apache/skywalking-eyes/dependency@61275cc80d0798a405cb070f7d3a8aaf7cf2c2c1 # v0.8.0",
    +    "sarisia/actions-status-discord" => "sarisia/actions-status-discord@eb045afee445dc055c18d3d90bd0f244fd062708 # v1.16.0"
       }
    -  if !recipe.dig(:template_preference, :add_template_only_nodes).nil?
    -    configured = DecisionPolicy.value_to_boolean(recipe.dig(:template_preference, :add_template_only_nodes))
    -    options[:add_template_only_nodes] = configured unless configured.nil?
    -  end
    -  options
     end
    -
    # File 'lib/kettle/jem.rb', line 3385
    +      
    # File 'lib/kettle/jem.rb', line 9769
     
    -def duplicate_drift_report(project_root:, template_root:, run_options: {})
    -  runner = run_options[:duplicate_drift_runner] || run_options["duplicate_drift_runner"]
    -  unless runner
    -    begin
    -      require "kettle/drift"
    -      runner = Kettle::Drift
    -    rescue LoadError
    -      return {
    -        available: false,
    -        reason: "kettle-drift is not available"
    -      }
    +def github_funding_platform_urls(platform, values)
    +  values.filter_map do |value|
    +    handle = value.to_s.strip.delete_prefix("@")
    +    next if handle.empty?
    +
    +    case platform
    +    when "buy_me_a_coffee"
    +      "https://www.buymeacoffee.com/#{handle}"
    +    when "custom"
    +      handle if http_url?(handle)
    +    when "github"
    +      "https://github.com/sponsors/#{handle}"
    +    when "ko_fi"
    +      "https://ko-fi.com/#{handle}"
    +    when "liberapay"
    +      "https://liberapay.com/#{handle}/donate"
    +    when "open_collective"
    +      "https://opencollective.com/#{handle}"
    +    when "thanks_dev"
    +      "https://thanks.dev/#{handle}"
    +    when "tidelift"
    +      "https://tidelift.com/funding/github/#{handle}"
         end
       end
    +end
    +
    +
    + +
    +

    + + .github_funding_urls(path, opencollective_disabled: false) ⇒ Object + - outcome = if runner.respond_to?(:call) - runner.call(project_root: project_root, template_dir: template_root) - else - runner.run( - project_root: project_root, - template_dir: template_root, - lock_path: File.join(project_root.to_s, ".kettle-drift.lock"), - mode: :force_update, - printer_class: nil - ) + + + +

    + + + + +
    +
    +
    +
    +9758
    +9759
    +9760
    +9761
    +9762
    +9763
    +9764
    +9765
    +9766
    +9767
    +
    +
    # File 'lib/kettle/jem.rb', line 9758
    +
    +def github_funding_urls(path, opencollective_disabled: false)
    +  funding = YAML.safe_load_file(path, permitted_classes: [], aliases: false) || {}
    +  return [] unless funding.is_a?(Hash)
    +
    +  funding.flat_map do |platform, value|
    +    next [] if opencollective_disabled && platform.to_s == "open_collective"
    +
    +    github_funding_platform_urls(platform.to_s, Array(value).compact)
       end
    +end
    +
    +
    + +
    +

    + + .github_org_from_url(url) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +11750
    +11751
    +11752
    +11753
    +
    +
    # File 'lib/kettle/jem.rb', line 11750
    +
    +def github_org_from_url(url)
    +  match = url.to_s.match(%r{\Ahttps?://github\.com/([^/]+)/})
    +  match && match[1]
    +end
    +
    +
    + +
    +

    + + .github_workflow_action_pin_key(record) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14727
    +14728
    +14729
    +
    +
    # File 'lib/kettle/jem.rb', line 14727
    +
    +def github_workflow_action_pin_key(record)
    +  [record.fetch(:action), record.fetch(:version)]
    +end
    +
    +
    + +
    +

    + + .github_workflow_action_pin_line_record(line, line_index) ⇒ Object + + + + + +

    + + + @@ -25765,31 +41004,154 @@

    -

    +

    + + .github_workflow_action_pin_records(content) ⇒ Object + + + + + +

    +
    +
    +
    +14731
    +14732
    +14733
    +14734
    +14735
    +14736
    +14737
    +14738
    +14739
    +14740
    +14741
    +14742
    +14743
    +14744
    +14745
    +14746
    +14747
    +14748
    +14749
    +
    +
    # File 'lib/kettle/jem.rb', line 14731
    +
    +def github_workflow_action_pin_line_record(line, line_index)
    +  # Psych intentionally drops comments, but the managed pin contract uses
    +  # the trailing comment as the human version label paired with the SHA.
    +  match = line.to_s.match(
    +    %r{
    +      \A\s*(?:-\s*)?uses:\s*
    +      (?<action>[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+(?:/[A-Za-z0-9_.-]+)*)
    +      @(?<sha>[a-f0-9]{40})\s+\#\s*(?<version>v?[^#\s]+)
    +    }x
    +  )
    +  return unless match
    +
       {
    -    available: true,
    -    warning_count: outcome.respond_to?(:warning_count) ? outcome.warning_count : outcome.fetch(:warning_count),
    -    json_path: outcome.respond_to?(:json_path) ? outcome.json_path : outcome[:json_path],
    -    lock_path: outcome.respond_to?(:lock_path) ? outcome.lock_path : outcome[:lock_path],
    -    exit_code: outcome.respond_to?(:exit_code) ? outcome.exit_code : outcome[:exit_code]
    -  }.compact
    -rescue => error
    -  {
    -    available: false,
    -    reason: "#{error.class}: #{error.message}"
    +    action: match[:action],
    +    sha: match[:sha],
    +    version: match[:version],
    +    line_index: line_index
       }
     end
    + + + + +
    +
    +
    +
    +14715
    +14716
    +14717
    +14718
    +14719
    +14720
    +14721
    +14722
    +14723
    +14724
    +14725
    +
    +
    # File 'lib/kettle/jem.rb', line 14715
    +
    +def github_workflow_action_pin_records(content)
    +  lines = content.to_s.lines
    +  yaml_scalar_pairs(content).filter_map do |key_node, value_node|
    +    next unless key_node.value.to_s == "uses"
    +    next unless value_node.value.to_s.include?("@")
    +
    +    github_workflow_action_pin_line_record(lines[key_node.start_line], key_node.start_line)
    +  end
    +rescue Psych::Exception
    +  []
    +end
    +
    +
    + +
    +

    + + .github_workflow_template_pin_warnings(recipe_reports) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14698
    +14699
    +14700
    +14701
    +14702
    +14703
    +14704
    +14705
    +14706
    +14707
    +14708
    +14709
    +14710
    +14711
    +14712
    +14713
    +
    +
    # File 'lib/kettle/jem.rb', line 14698
    +
    +def github_workflow_template_pin_warnings(recipe_reports)
    +  records = recipe_reports.flat_map do |report|
    +    Array(report.dig(:metadata, :stale_github_workflow_template_pins))
    +  end
    +  return [] if records.empty?
    +
    +  grouped = records.group_by { |record| record.fetch(:path) }
    +  grouped.map do |path, path_records|
    +    actions = path_records.map { |record| "#{record.fetch(:action)} #{record.fetch(:version)}" }.uniq.sort.join(", ")
    +    [
    +      "GitHub Actions template pins appear stale for #{path}:",
    +      "preserved existing project pin(s) for #{actions}.",
    +      "Update kettle-jem's workflow template pins."
    +    ].join(" ")
    +  end
    +end
    +
    +
    + +
    +

    - .enabled_ruby_engines(config) ⇒ Object + .github_workflow_template_recipe?(recipe) ⇒ Boolean -

    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -25797,9 +41159,9 @@

    -

    +

    - .enforce_git_preflight!(git_preflight, decision_policy:, template_selection:) ⇒ Object + .github_workflows_include?(project_root, needle) ⇒ Boolean @@ -25814,13 +41176,13 @@

    -

    Raises:

    -
      +

      Returns:

      +
      • - (Error) + (Boolean) @@ -25834,21 +41196,23 @@

         
         
        -7577
        -7578
        -7579
        -7580
        -7581
        -7582
        +12885 +12886 +12887 +12888 +12889 +12890 +12891

    @@ -25856,9 +41220,9 @@

    -

    +

    - .ensure_gemspec_legacy_version_loader_preamble(content, entrypoint_require:, namespace:, min_ruby:) ⇒ Object + .gitlab_repo_url(repository, repo_slug, suffix) ⇒ Object @@ -25870,29 +41234,31 @@

    -6054 -6055 -6056 -6057 -6058 -6059 -6060 -6061 -6062 -6063 +11902 +11903 +11904 +11905 +11906 +11907 +11908 +11909 +11910 +11911 +11912

    @@ -25900,9 +41266,9 @@

    -

    +

    - .ensure_monorepo_root_gemfile_dependencies(content) ⇒ Object + .guard_main_gemfile_runtime_workspace_overrides(content) ⇒ Object @@ -25914,29 +41280,47 @@

    -3268 -3269 -3270 -3271 -3272 -3273 -3274 -3275 -3276 -3277 +5618 +5619 +5620 +5621 +5622 +5623 +5624 +5625 +5626 +5627 +5628 +5629 +5630 +5631 +5632 +5633 +5634 +5635 +5636

    @@ -25944,9 +41328,9 @@

    -

    +

    - .ensure_trailing_newline(text) ⇒ Object + .html_attribute_escape(value) ⇒ Object @@ -25958,19 +41342,74 @@

     
     
    -11668
    -11669
    -11670
    -11671
    -11672
    +12251 +12252 +12253

    + +
     
     
    -10600
    -10601
    -10602
    -10603
    +6369 +6370 +6371
    -
    # File 'lib/kettle/jem.rb', line 10600
    +      
    # File 'lib/kettle/jem.rb', line 6369
     
    -def enabled_ruby_engines(config)
    -  engines = ruby_engines_config(config)
    -  (engines.nil? || engines.empty?) ? DEFAULT_ENGINES : engines
    +def github_workflow_template_recipe?(recipe)
    +  recipe.fetch(:target_path).to_s.start_with?(".github/workflows/")
     end
    -
    # File 'lib/kettle/jem.rb', line 7577
    +      
    # File 'lib/kettle/jem.rb', line 12885
     
    -def enforce_git_preflight!(git_preflight, decision_policy:, template_selection:)
    -  return unless decision_policy.require_clean
    -  return if template_selection.fetch(:skip_commit, false)
    -  raise Error, "Git preflight failed: project is not a git repository" unless git_preflight.fetch(:git_repository)
    -  raise Error, "Git preflight failed: worktree is not clean" unless git_preflight.fetch(:clean_worktree)
    +def github_workflows_include?(project_root, needle)
    +  Dir.glob(File.join(project_root, ".github/workflows/*.{yml,yaml}")).any? do |path|
    +    File.read(path).include?(needle)
    +  rescue Errno::ENOENT
    +    false
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 6054
    -
    -def ensure_gemspec_legacy_version_loader_preamble(content, entrypoint_require:, namespace:, min_ruby:)
    -  block = "#{gemspec_legacy_version_loader_block(entrypoint_require: entrypoint_require, namespace: namespace, min_ruby: min_ruby)}\n"
    -  node = gemspec_top_level_gem_version_node(content)
    -  return replace_source_range_lines(content, node.location.start_line, expand_line_range_through_following_blanks(content, node.location.end_line), block) if node
    +      
    # File 'lib/kettle/jem.rb', line 11902
     
    -  gemspec_call = gemspec_new_call(content)
    -  return content unless gemspec_call
    +def gitlab_repo_url(repository, repo_slug, suffix)
    +  resources = repository[:resource_urls] || {}
    +  return resources[:gitlab_issues_url] if suffix == "issues" && resources[:gitlab_issues_url]
    +  return resources[:gitlab_pulls_url] if suffix == "merge_requests" && resources[:gitlab_pulls_url]
    +  return resources[:gitlab_wiki_url] if suffix == "wikis/home" && resources[:gitlab_wiki_url]
    +  return resources[:gitlab_contributors_url] if suffix == "graphs/main" && resources[:gitlab_contributors_url]
     
    -  insert_lines_before(content, gemspec_call.location.start_line, block)
    +  base = repository[:gitlab_url].to_s
    +  base = "https://gitlab.com/#{repo_slug}" if base.empty?
    +  "#{base}/-/#{suffix}"
     end
    -
    # File 'lib/kettle/jem.rb', line 3268
    +      
    # File 'lib/kettle/jem.rb', line 5618
     
    -def ensure_monorepo_root_gemfile_dependencies(content)
    -  updated = ensure_trailing_newline(content.to_s.empty? ? %(source "https://gem.coop"\n) : content.to_s).dup
    -  monorepo_root_gemfile_dependency_lines.each do |line|
    -    next if gemfile_declares_gem?(updated, line.fetch(:name))
    +def guard_main_gemfile_runtime_workspace_overrides(content)
    +  content = collapse_nested_templating_guards(content)
    +  content = normalize_templating_guard_indentation(content)
    +  records = runtime_workspace_override_records(content)
    +  return content if records.empty?
     
    -    updated << "\n" unless updated.end_with?("\n\n")
    -    updated << line.fetch(:source)
    +  output = content.to_s
    +  records.sort_by { |record| -record.fetch(:start_line) }.each do |record|
    +    source = output.lines[(record.fetch(:start_line) - 1)..(record.fetch(:end_line) - 1)].join
    +    guarded = [
    +      %(unless ENV.fetch("K_JEM_TEMPLATING", "false").casecmp("true").zero?),
    +      indent_source(source, 2).rstrip,
    +      "end",
    +      ""
    +    ].join("\n")
    +    output = replace_source_range_lines(output, record.fetch(:start_line), record.fetch(:end_line), guarded)
       end
    -  ensure_trailing_newline(updated)
    +  output
     end
    -
    # File 'lib/kettle/jem.rb', line 11668
    +      
    # File 'lib/kettle/jem.rb', line 12251
     
    -def ensure_trailing_newline(text)
    -  return "" if text.to_s.empty?
    +def html_attribute_escape(value)
    +  value.to_s.gsub("&", "&amp;").gsub("\"", "&quot;").gsub("<", "&lt;").gsub(">", "&gt;")
    +end
    +
    +
    + +
    +

    + + .http_url?(value) ⇒ Boolean + - text.end_with?("\n") ? text : "#{text}\n" + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + @@ -25978,9 +41417,9 @@

    -

    +

    - .ensure_workflow_top_level_section(content, key, section, before:) ⇒ Object + .inactive_packaged_template_cleanup_files(project_root, config = {}) ⇒ Object @@ -25992,39 +41431,27 @@

     
     
    -11464
    -11465
    -11466
    -11467
    -11468
    -11469
    -11470
    -11471
    -11472
    -11473
    -11474
    -11475
    -11476
    -11477
    -11478
    +13286 +13287 +13288 +13289 +13290 +13291 +13292 +13293 +13294

    @@ -26032,35 +41459,58 @@

    -

    +

    - .env_overridden_gemspec_fields(env) ⇒ Object + .inactive_packaged_workflow?(relative_path, config = {}, include_patterns: nil) ⇒ Boolean -

    +
    +
    +
    +14506
    +14507
    +14508
    +14509
    +14510
    +14511
    +
    +
    # File 'lib/kettle/jem.rb', line 14506
    +
    +def http_url?(value)
    +  uri = URI.parse(value.to_s)
    +  %w[http https].include?(uri.scheme)
    +rescue URI::InvalidURIError
    +  false
     end
    -
    # File 'lib/kettle/jem.rb', line 11464
    +      
    # File 'lib/kettle/jem.rb', line 13286
     
    -def ensure_workflow_top_level_section(content, key, section, before:)
    -  top_level_keys = yaml_top_level_key_lines(content)
    -  return content if top_level_keys.key?(key.to_s)
    +def inactive_packaged_template_cleanup_files(project_root, config = {})
    +  gemfile_cleanups = Dir.glob(File.join(project_root, "gemfiles/**/*.gemfile")).filter_map do |path|
    +    relative_path = path.delete_prefix("#{project_root}/")
    +    next unless preferred_template_source(PACKAGED_TEMPLATE_ROOT, relative_path)
     
    -  lines = content.lines
    -  index = top_level_keys[before.to_s]
    -  if index
    -    prepared_section = (index.zero? || lines[index - 1].strip.empty?) ? section : "\n#{section}"
    -    lines.insert(index, prepared_section)
    -  else
    -    lines << "\n" unless lines.empty? || lines.last == "\n"
    -    lines << section
    +    {target_path: relative_path} if skip_packaged_gemfile_template?(relative_path, config)
       end
    -  lines.join
    +  (gemfile_cleanups + disabled_integration_config_cleanups(project_root, config)).sort_by { |cleanup| cleanup.fetch(:target_path) }
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -26068,9 +41518,9 @@

    -

    +

    - .execute_recipe(project_root:, recipe:, facts:, files:, decision_policy:, env: ENV) ⇒ Object + .inactive_packaged_workflow_cleanup_files(project_root, config = {}, include_patterns: nil) ⇒ Object @@ -26082,203 +41532,31 @@

     
     
    -3842
    -3843
    -3844
    -3845
    -3846
    -3847
    -3848
    -3849
    -3850
    -3851
    -3852
    -3853
    -3854
    -3855
    -3856
    -3857
    -3858
    -3859
    -3860
    -3861
    -3862
    -3863
    -3864
    -3865
    -3866
    -3867
    -3868
    -3869
    -3870
    -3871
    -3872
    -3873
    -3874
    -3875
    -3876
    -3877
    -3878
    -3879
    -3880
    -3881
    -3882
    -3883
    -3884
    -3885
    -3886
    -3887
    -3888
    -3889
    -3890
    -3891
    -3892
    -3893
    -3894
    -3895
    -3896
    -3897
    -3898
    -3899
    -3900
    -3901
    -3902
    -3903
    -3904
    -3905
    -3906
    -3907
    -3908
    -3909
    -3910
    -3911
    -3912
    -3913
    -3914
    -3915
    -3916
    -3917
    -3918
    -3919
    -3920
    -3921
    -3922
    -3923
    -3924
    -3925
    -3926
    -3927
    -3928
    -3929
    -3930
    -3931
    -3932
    -3933
    -3934
    -3935
    -3936
    -3937
    -3938
    +9817 +9818 +9819 +9820 +9821 +9822 +9823 +9824 +9825 +9826 +9827

    @@ -26286,9 +41564,9 @@

    -

    +

    - .existing_entrypoint_version_namespace(project_root, relative_path) ⇒ Object + .indent_source(source, spaces) ⇒ Object @@ -26300,15 +41578,17 @@

     
     
    -8915
    -8916
    -8917
    +6126 +6127 +6128 +6129

    @@ -26316,9 +41596,9 @@

    -

    +

    - .existing_version_file_value(project_root, relative_path) ⇒ Object + .inject_appraisal_gemfiles(block, gemfiles) ⇒ Object @@ -26330,15 +41610,45 @@

     
     
    -8867
    -8868
    -8869
    - -

    + @@ -26346,9 +41656,9 @@

    -

    +

    - .existing_version_namespace(project_root, relative_path) ⇒ Object + .inject_framework_matrix_workflow_env(content, facts) ⇒ Object @@ -26360,15 +41670,69 @@

     
     
    -8871
    -8872
    -8873
    +6229 +6230 +6231 +6232 +6233 +6234 +6235 +6236 +6237 +6238 +6239 +6240 +6241 +6242 +6243 +6244 +6245 +6246 +6247 +6248 +6249 +6250 +6251 +6252 +6253 +6254 +6255 +6256 +6257 +6258

    @@ -26376,9 +41740,9 @@

    -

    +

    - .expand_framework_gemfile_pattern(pattern, version) ⇒ Object + .inject_main_gemfile_recording_eval(content, facts) ⇒ Object @@ -26390,25 +41754,27 @@

     
     
    -10865
    -10866
    -10867
    -10868
    -10869
    -10870
    -10871
    -10872
    +6466 +6467 +6468 +6469 +6470 +6471 +6472 +6473 +6474

    @@ -26416,9 +41782,9 @@

    -

    +

    - .expand_line_range_through_following_blanks(content, end_line) ⇒ Object + .inject_standard_appraisal_gemfiles(content, facts) ⇒ Object @@ -26430,21 +41796,47 @@

    -6077 -6078 -6079 -6080 -6081 -6082 +6991 +6992 +6993 +6994 +6995 +6996 +6997 +6998 +6999 +7000 +7001 +7002 +7003 +7004 +7005 +7006 +7007 +7008 +7009

    @@ -26452,9 +41844,9 @@

    -

    +

    - .explicit_zero_runtime_floor?(facts) ⇒ Boolean + .insert_after_line_sequence(content, sequence, insertion, error_message) ⇒ Object @@ -26469,13 +41861,13 @@

    -

    Returns:

    -
      +

      Raises:

      +
      • - (Boolean) + (Error) @@ -26489,15 +41881,35 @@

         
         
        -6177
        -6178
        -6179
        +9385 +9386 +9387 +9388 +9389 +9390 +9391 +9392 +9393 +9394 +9395 +9396 +9397

    @@ -26505,9 +41917,9 @@

    -

    +

    - .extract_gemspec_development_dependencies(gemspec) ⇒ Object + .insert_gemfile_dependency_blocks(content, blocks) ⇒ Object @@ -26519,43 +41931,29 @@

    -3014 -3015 -3016 -3017 -3018 -3019 -3020 -3021 -3022 -3023 -3024 -3025 -3026 -3027 -3028 -3029 -3030 +6518 +6519 +6520 +6521 +6522 +6523 +6524 +6525 +6526 +6527

    @@ -26563,9 +41961,9 @@

    -

    +

    - .fallback_adapter_failure_template_source(file_type, recipe, template_content, destination_content, facts) ⇒ Object + .insert_lines_after(content, line_number, insertion) ⇒ Object @@ -26577,33 +41975,19 @@

    -5088 -5089 -5090 -5091 -5092 -5093 -5094 -5095 -5096 -5097 -5098 -5099 +8708 +8709 +8710 +8711 +8712

    @@ -26611,52 +41995,121 @@

    -

    +

    - .falsey_config?(value) ⇒ Boolean + .insert_lines_before(content, line_number, insertion) ⇒ Object -

    -
    +
     
     
    -6264
    -6265
    -6266
    -6267
    -6268
    -6269
    +9829 +9830 +9831 +9832 +9833 +9834
    -
    # File 'lib/kettle/jem.rb', line 6264
    +      
    # File 'lib/kettle/jem.rb', line 9829
     
    -def env_overridden_gemspec_fields(env)
    -  fields = []
    -  fields << "authors" if present_template_token_value?(env["KJ_AUTHOR_NAME"].to_s)
    -  fields << "email" if present_template_token_value?(env["KJ_AUTHOR_EMAIL"].to_s)
    -  fields
    +def inactive_packaged_workflow?(relative_path, config = {}, include_patterns: nil)
    +  return true if stale_versioned_engine_workflow?(relative_path)
    +
    +  preferred_template_source(PACKAGED_TEMPLATE_ROOT, relative_path) &&
    +    skip_packaged_workflow_template?(relative_path, config, include_patterns: include_patterns)
     end
    -
    # File 'lib/kettle/jem.rb', line 3842
    +      
    # File 'lib/kettle/jem.rb', line 9817
     
    -def execute_recipe(project_root:, recipe:, facts:, files:, decision_policy:, env: ENV)
    -  relative_path = recipe.fetch(:target_path)
    -  destination_existed = File.exist?(File.join(project_root, relative_path))
    -  original = files.fetch(relative_path, "")
    -  deletion = rakefile_scaffold_cleanup_recipe?(recipe) ? rakefile_scaffold_cleanup(original, facts) : nil
    -  final = case recipe.fetch(:name)
    -  when "readme_metadata"
    -    synchronize_readme(original, facts, project_root: project_root)
    -  when "changelog_unreleased"
    -    normalize_changelog(original, facts)
    -  when "generated_block_sync"
    -    synchronize_managed_block(original, facts)
    -  when "github_funding_yml"
    -    synchronize_github_funding_yml(original, facts)
    -  when "github_actions_ci"
    -    synchronize_github_actions_ci(original, facts)
    -  when "github_actions_framework_ci"
    -    synchronize_github_actions_framework_ci(original, facts)
    -  when /\Agithub_actions_framework_gemfile_/
    -    synchronize_github_actions_framework_gemfile(recipe.fetch(:target_path), facts)
    -  when "github_actions_coverage_ci"
    -    synchronize_github_actions_coverage_ci(original, facts)
    -  when /\Agithub_actions_obsolete_workflow_cleanup_/
    -    ""
    -  when /\Agithub_actions_opt_in_workflow_cleanup_/
    -    ""
    -  when /\Aopencollective_disabled_file_cleanup_/
    -    ""
    -  when /\Atemplate_legacy_destination_cleanup_/
    -    ""
    -  when /\Atemplate_obsolete_license_cleanup_/
    -    ""
    -  when /\Agithub_actions_workflow_snippets_/
    -    synchronize_github_actions_workflow_snippets(original)
    -  when "kettle_config_bootstrap"
    -    apply_kettle_config_bootstrap(project_root, recipe, env: env)
    -  when /\Atemplate_source_preference_/
    -    original
    -  when /\Atemplate_source_application_/
    -    apply_template_source(project_root, recipe, original, facts: facts, env: env)
    -  when "rakefile_scaffold_cleanup"
    -    deletion.fetch(:content)
    -  else
    -    original
    -  end
    -  final = normalize_generated_rakefile(final) if relative_path == "Rakefile"
    -  final = ensure_trailing_newline(final) unless delete_file_recipe?(recipe)
    +def inactive_packaged_workflow_cleanup_files(project_root, config = {}, include_patterns: nil)
    +  workflow_root = File.join(project_root, ".github", "workflows")
    +  return [] unless Dir.exist?(workflow_root)
     
    -  template_content = recipe_template_content(project_root, recipe)
    -  request = content_recipe_execution_request(
    -    recipe_name: recipe.fetch(:primitive),
    -    recipe_version: "1",
    -    relative_path: relative_path,
    -    provider_family: recipe.fetch(:provider_family),
    -    provider_backend: recipe[:provider_backend],
    -    template_content: template_content,
    -    destination_content: original,
    -    steps: [content_recipe_step(recipe)],
    -    runtime_context: recipe_runtime_context(recipe, facts, deletion),
    -    metadata: {packaging_recipe: recipe.fetch(:name), project_root: project_root.to_s}
    -  )
    -  changed = delete_file_recipe?(recipe) || final != original
    -   = (recipe).merge(destination_existed: destination_existed)
    -  decision_evaluation = recipe_decision_evaluation(
    -    decision_policy: decision_policy,
    -    recipe: recipe,
    -    changed: changed,
    -    destination_existed: destination_existed
    -  )
    -  if %w[keep skip].include?(decision_evaluation.fetch(:selected_action))
    -    final = original
    -    changed = false
    -    deletion = nil
    -  end
    -  step_report = content_recipe_step_report(recipe: recipe, request: request, original: original, final: final, changed: changed, deletion: deletion)
    -  [:decision_evaluation] = decision_evaluation
    -  report = content_recipe_execution_report(
    -    request: request,
    -    final_content: final,
    -    changed: changed,
    -    step_reports: [step_report],
    -    diagnostics: [],
    -    metadata: 
    -  )
    +  Dir.glob(File.join(workflow_root, "*.{yml,yaml}")).filter_map do |path|
    +    relative_path = path.delete_prefix("#{project_root}/")
    +    next if OPT_IN_GITHUB_WORKFLOWS.include?(relative_path)
     
    -  {
    -    recipe_name: recipe.fetch(:name),
    -    relative_path: relative_path,
    -    changed: changed,
    -    request_envelope: content_recipe_execution_request_envelope(request),
    -    report_envelope: content_recipe_execution_report_envelope(report),
    -    final_content: final,
    -    metadata: ,
    -    decision_evaluation: decision_evaluation,
    -    diagnostics: []
    -  }
    +    relative_path if inactive_packaged_workflow?(relative_path, config, include_patterns: include_patterns)
    +  end.sort
     end
    -
    # File 'lib/kettle/jem.rb', line 8915
    +      
    # File 'lib/kettle/jem.rb', line 6126
     
    -def existing_entrypoint_version_namespace(project_root, relative_path)
    -  ruby_version_class_eval_namespaces(read_project_file(project_root, relative_path)).first
    +def indent_source(source, spaces)
    +  prefix = " " * spaces
    +  source.to_s.lines.map { |line| line.strip.empty? ? line : "#{prefix}#{line}" }.join
     end
    -
    # File 'lib/kettle/jem.rb', line 8867
    +7040
    +7041
    +7042
    +7043
    +7044
    +7045
    +7046
    +7047
    +7048
    +7049
    +7050
    +7051
    +7052
    +7053
    +7054
    +7055
    +7056
    +7057
    +
    +
    # File 'lib/kettle/jem.rb', line 7040
    +
    +def inject_appraisal_gemfiles(block, gemfiles)
    +  lines = block.to_s.lines
    +  existing_paths = ruby_call_records(block, :eval_gemfile).filter_map { |call| ruby_string_argument(call) }.to_set
    +  additions = gemfiles.filter_map do |gemfile|
    +    path = gemfile.to_s.delete_prefix("gemfiles/")
    +    line = %(  eval_gemfile "#{path}") + "\n"
    +    line unless existing_paths.include?(path)
    +  end
    +  return block if additions.empty?
    +
    +  insert_line = appraisal_x_stdlib_eval_gemfile_call(block)&.location&.start_line ||
    +    ruby_call_records(block, :appraise).first&.location&.end_line
    +  insert_index = insert_line ? insert_line - 1 : nil
    +  return block unless insert_index
     
    -def existing_version_file_value(project_root, relative_path)
    -  ruby_version_constant_value(read_project_file(project_root, relative_path)).to_s
    +  lines.insert(insert_index, *additions)
    +  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 8871
    +      
    # File 'lib/kettle/jem.rb', line 6229
     
    -def existing_version_namespace(project_root, relative_path)
    -  ruby_version_module_namespace(read_project_file(project_root, relative_path))
    +def inject_framework_matrix_workflow_env(content, facts)
    +  env_by_appraisal = framework_matrix_appraisal_env_by_name(facts)
    +  return content if env_by_appraisal.empty?
    +
    +  lines = content.to_s.lines
    +  inserted_keys = Set.new
    +  inserted_locations = Set.new
    +  yaml_mapping_nodes(content).sort_by { |mapping| -mapping.start_line }.each do |mapping|
    +    appraisal = yaml_mapping_scalar_value(mapping, "appraisal")
    +    matrix_env = env_by_appraisal[appraisal]
    +    next unless matrix_env
    +
    +    insert_index = workflow_matrix_env_insert_index(lines, mapping)
    +    next unless insert_index
    +
    +    indent = workflow_matrix_env_indent(lines, mapping)
    +    additions = matrix_env.reject { |key, _value| yaml_mapping_scalar_value(mapping, key) }
    +    additions.reject! { |key, _value| inserted_locations.include?([insert_index, key.to_s]) }
    +    next if additions.empty?
    +
    +    additions.each_key { |key| inserted_keys << key }
    +    additions.each_key { |key| inserted_locations << [insert_index, key.to_s] }
    +    lines.insert(insert_index, *additions.map { |key, value| %(#{indent}#{key}: #{yaml_double_quoted_scalar(value)}\n) })
    +  end
    +  return content if inserted_keys.empty?
    +
    +  add_framework_matrix_job_env(lines.join, inserted_keys)
    +rescue
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 10865
    +      
    # File 'lib/kettle/jem.rb', line 6466
     
    -def expand_framework_gemfile_pattern(pattern, version)
    -  replacement = if pattern.include?("_{version}") || pattern.include?("{version}_")
    -    version.tr(".", "_")
    -  else
    -    version
    -  end
    -  pattern.gsub("{version}", replacement)
    +def inject_main_gemfile_recording_eval(content, facts)
    +  return content unless facts.to_h.dig(:ci, :recording)
    +  return content if gemfile_eval_paths(content).any? { |path| path.to_s.include?("gemfiles/modular/recording/") }
    +
    +  lines = content.to_s.lines
    +  insert_at = main_gemfile_recording_insertion_index(content) || lines.length
    +  lines.insert(insert_at, "# Test HTTP Interaction Recording\n", %(eval_gemfile "#{main_gemfile_recording_eval_path}"\n), "\n")
    +  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 6077
    +      
    # File 'lib/kettle/jem.rb', line 6991
     
    -def expand_line_range_through_following_blanks(content, end_line)
    -  lines = content.to_s.lines
    -  line = end_line
    -  line += 1 while lines[line]&.strip == ""
    -  line
    +def inject_standard_appraisal_gemfiles(content, facts)
    +  gemfiles = facts.to_h.dig(:ci, :standard_appraisal_gemfiles).to_a
    +  return content if gemfiles.empty?
    +
    +  standard_names = standard_test_appraisal_names(content)
    +  return content if standard_names.empty?
    +
    +  matrix_dependency_gemfiles = framework_matrix_appraisal_dependency_gemfiles(facts)
    +  parsed = appraisal_blocks(content)
    +  blocks = parsed.fetch(:order).map do |name|
    +    block = parsed.fetch(:blocks).fetch(name)
    +    if standard_names.include?(name) && !appraisal_block_has_matrix_dependency_gemfile?(block, matrix_dependency_gemfiles)
    +      inject_appraisal_gemfiles(block, gemfiles)
    +    else
    +      block
    +    end
    +  end
    +  ensure_trailing_newline(([parsed.fetch(:prelude).to_s.rstrip] + blocks.map(&:rstrip)).reject(&:empty?).join("\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 6177
    +      
    # File 'lib/kettle/jem.rb', line 9385
     
    -def explicit_zero_runtime_floor?(facts)
    -  facts.to_h.dig(:rubygems, :min_ruby).to_s.strip == "0"
    +def insert_after_line_sequence(content, sequence, insertion, error_message)
    +  lines = content.to_s.lines(chomp: true)
    +  index = (0..(lines.length - sequence.length)).find do |candidate|
    +    lines[candidate, sequence.length] == sequence
    +  end
    +  return content if !index && error_message.nil?
    +  raise Error, error_message unless index
    +
    +  insertion_lines = insertion.to_s.lines(chomp: true)
    +  updated = lines.dup
    +  updated.insert(index + sequence.length, *insertion_lines)
    +  "#{updated.join("\n")}\n"
     end
    -
    # File 'lib/kettle/jem.rb', line 3014
    +      
    # File 'lib/kettle/jem.rb', line 6518
     
    -def extract_gemspec_development_dependencies(gemspec)
    -  if gemspec.is_a?(Hash)
    -    return Array(gemspec[:development_dependencies] || gemspec["development_dependencies"]).map do |dependency|
    -      {
    -        name: dependency.name.to_s,
    -        requirement: dependency.requirement.to_s
    -      }
    -    end.reject { |dependency| dependency.fetch(:name).empty? }.uniq { |dependency| dependency.fetch(:name) }
    +def insert_gemfile_dependency_blocks(content, blocks)
    +  lines = content.to_s.lines
    +  insert_at = gemfile_dependency_insertion_line(content)
    +  while insert_at.positive? && lines[insert_at - 1].strip.empty?
    +    insert_at -= 1
       end
    -
    -  Array(gemspec&.development_dependencies).map do |dependency|
    -    {
    -      name: dependency.name.to_s,
    -      requirement: dependency.requirement.to_s
    -    }
    -  end.reject { |dependency| dependency.fetch(:name).empty? }.uniq { |dependency| dependency.fetch(:name) }
    +  insertion = blocks.map { |block| block.strip }.join("\n\n")
    +  lines.insert(insert_at, "#{insertion}\n\n")
    +  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 5088
    +      
    # File 'lib/kettle/jem.rb', line 8708
     
    -def fallback_adapter_failure_template_source(file_type, recipe, template_content, destination_content, facts)
    -  case file_type
    -  when :gemfile
    -    finalize_gemfile_template_source(recipe, template_content, destination_content, facts: facts, template_content: template_content)
    -  when :appraisals
    -    merge_appraisals_template_policy(template_content, facts: facts)
    -  when :yaml
    -    raise ArgumentError, "failed to merge yaml template #{recipe.fetch(:target_path)}: provider adapter failure"
    -  else
    -    template_content
    -  end
    +def insert_lines_after(content, line_number, insertion)
    +  lines = content.to_s.lines
    +  lines.insert(line_number, insertion)
    +  lines.join
     end
    + + + + +
    +
    +
    +
    +8702
    +8703
    +8704
    +8705
    +8706
    +
    +
    # File 'lib/kettle/jem.rb', line 8702
    +
    +def insert_lines_before(content, line_number, insertion)
    +  lines = content.to_s.lines
    +  lines.insert([line_number - 1, 0].max, insertion)
    +  lines.join
    +end
    +
    +
    +
    +

    + + .insert_missing_development_gemspec_dependency_lines(content, missing_lines) ⇒ Object + + -

    + + + + + + +
    +
    +
    +
    +8532
    +8533
    +8534
    +8535
    +8536
    +
    +
    # File 'lib/kettle/jem.rb', line 8532
    +
    +def insert_missing_development_gemspec_dependency_lines(content, missing_lines)
    +  return content if missing_lines.empty?
    +
    +  insert_lines_before(content, gemspec_end_line(content), missing_lines.join)
    +end
    +
    -
    + +
    +

    -

    Returns:

    -
      + .insert_missing_gemspec_assignment_sources(content, replacements, receiver:) ⇒ Object -
    • - - - (Boolean) - - - -
    • + -
    -

    + +
    @@ -26664,9 +42117,9 @@

    -

    +

    - .filter_recipe_pack(pack, template_selection) ⇒ Object + .insert_missing_gemspec_files_assignment(content, template_content:, template_receiver:) ⇒ Object @@ -26678,25 +42131,43 @@

     
     
    -7219
    -7220
    -7221
    -7222
    -7223
    -7224
    -7225
    -7226
    +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760

    @@ -26704,9 +42175,9 @@

    -

    +

    - .finalize_accepted_template_source(recipe, content, destination_content, facts:, project_root: nil) ⇒ Object + .insert_missing_runtime_gemspec_dependency_lines(content, missing_lines, receiver:) ⇒ Object @@ -26718,43 +42189,25 @@

     
     
    -4268
    -4269
    -4270
    -4271
    -4272
    -4273
    -4274
    -4275
    -4276
    -4277
    -4278
    -4279
    -4280
    -4281
    -4282
    -4283
    -4284
    +8523 +8524 +8525 +8526 +8527 +8528 +8529 +8530

    @@ -26762,9 +42215,9 @@

    -

    +

    - .finalize_gemfile_template_source(recipe, content, destination_content, facts:, template_content:) ⇒ Object + .insert_yaml_scalar_after_path(content, path, key, value) ⇒ Object @@ -26776,33 +42229,43 @@

     
     
    -4826
    -4827
    -4828
    -4829
    -4830
    -4831
    -4832
    -4833
    -4834
    -4835
    -4836
    -4837
    +8968 +8969 +8970 +8971 +8972 +8973 +8974 +8975 +8976 +8977 +8978 +8979 +8980 +8981 +8982 +8983 +8984

    @@ -26810,9 +42273,9 @@

    -

    +

    - .finalize_github_workflow_template(content, facts = nil) ⇒ Object + .install_tasksObject @@ -26824,15 +42287,17 @@

     
     
    -4928
    -4929
    -4930
    +2137 +2138 +2139 +2140

    @@ -26840,9 +42305,9 @@

    -

    +

    - .finalize_rubocop_config(content) ⇒ Object + .integration_license_spdx(config, license) ⇒ Object @@ -26854,15 +42319,27 @@

     
     
    -4264
    -4265
    -4266
    +12828 +12829 +12830 +12831 +12832 +12833 +12834 +12835 +12836

    @@ -26870,9 +42347,9 @@

    -

    +

    - .finalize_template_source_content(recipe, content) ⇒ Object + .json_merge_options(recipe) ⇒ Object @@ -26884,19 +42361,33 @@

     
     
    -4258
    -4259
    -4260
    -4261
    -4262
    +7152 +7153 +7154 +7155 +7156 +7157 +7158 +7159 +7160 +7161 +7162 +7163

    @@ -26904,9 +42395,9 @@

    -

    +

    - .first_grapheme(text) ⇒ Object + .kettle_config_bootstrap_facts(project_root, env, template_selection: {}) ⇒ Object @@ -26918,15 +42409,53 @@

     
     
    -7124
    -7125
    -7126
    +13315 +13316 +13317 +13318 +13319 +13320 +13321 +13322 +13323 +13324 +13325 +13326 +13327 +13328 +13329 +13330 +13331 +13332 +13333 +13334 +13335 +13336

    @@ -26934,9 +42463,9 @@

    -

    +

    - .forge_facts(config, env, derived_github_user: nil) ⇒ Object + .kettle_config_bootstrap_recipe(bootstrap) ⇒ Object @@ -26948,29 +42477,55 @@

     
     
    -8374
    -8375
    -8376
    -8377
    -8378
    -8379
    -8380
    -8381
    -8382
    -8383
    +13338 +13339 +13340 +13341 +13342 +13343 +13344 +13345 +13346 +13347 +13348 +13349 +13350 +13351 +13352 +13353 +13354 +13355 +13356 +13357 +13358 +13359 +13360

    @@ -26978,9 +42533,9 @@

    -

    +

    - .forge_template_tokens(forge) ⇒ Object + .kettle_config_file_override_lines(path, strategy) ⇒ Object @@ -26992,25 +42547,31 @@

     
     
    -8389
    -8390
    -8391
    -8392
    -8393
    -8394
    -8395
    -8396
    +9263 +9264 +9265 +9266 +9267 +9268 +9269 +9270 +9271 +9272 +9273

    @@ -27018,9 +42579,9 @@

    -

    +

    - .forge_user_value(forge_config, env, key, derived_value: nil) ⇒ Object + .kettle_config_template_entries_lines(entries) ⇒ Object @@ -27032,15 +42593,33 @@

     
     
    -8385
    -8386
    -8387
    +3791 +3792 +3793 +3794 +3795 +3796 +3797 +3798 +3799 +3800 +3801 +3802

    @@ -27048,9 +42627,9 @@

    -

    - .format_copyright_years(years) ⇒ Object + .kettle_dev_local_gems(config) ⇒ Object @@ -27062,45 +42641,21 @@

    @@ -27108,9 +42663,9 @@ @@ -27138,9 +42709,9 @@

    -

    +

    - .framework_matrix_appraisal_block(entry) ⇒ Object + .kettle_jem_config_path(project_root) ⇒ Object @@ -27152,29 +42723,21 @@

     
     
    -5720
    -5721
    -5722
    -5723
    -5724
    -5725
    -5726
    -5727
    -5728
    -5729
    +9965 +9966 +9967 +9968 +9969 +9970

    @@ -27182,9 +42745,9 @@

    -

    +

    - .framework_matrix_appraisal_dependency_gemfiles(facts) ⇒ Object + .kettle_jem_config_relative_path(project_root) ⇒ Object @@ -27196,23 +42759,17 @@

    -5617 -5618 -5619 -5620 -5621 -5622 -5623 +9972 +9973 +9974 +9975

    @@ -27220,9 +42777,9 @@

    -

    +

    - .framework_matrix_appraisal_env_by_name(facts) ⇒ Object + .known_license_template_basenamesObject @@ -27234,23 +42791,15 @@

     
     
    -4963
    -4964
    -4965
    -4966
    -4967
    -4968
    -4969
    +13556 +13557 +13558

    @@ -27258,9 +42807,9 @@

    -

    +

    - .framework_matrix_appraisal_gemfile_path(path) ⇒ Object + .large_business_license_cell(author_email) ⇒ Object @@ -27272,15 +42821,25 @@

    -10753 -10754 -10755 +12626 +12627 +12628 +12629 +12630 +12631 +12632 +12633

    @@ -27288,9 +42847,9 @@

    -

    +

    - .framework_matrix_appraisal_gemfiles(raw) ⇒ Object + .leading_space_count(line) ⇒ Object @@ -27302,21 +42861,15 @@

     
     
    -10746
    -10747
    -10748
    -10749
    -10750
    -10751
    +6036 +6037 +6038

    @@ -27324,9 +42877,9 @@

    -

    +

    - .framework_matrix_appraisal_name(dimension, slug) ⇒ Object + .leading_whitespace(source) ⇒ Object @@ -27338,15 +42891,17 @@

     
     
    -10757
    -10758
    -10759
    +8714 +8715 +8716 +8717

    @@ -27354,9 +42909,9 @@

    -

    +

    - .framework_matrix_env(raw) ⇒ Object + .legacy_rbs_consolidation_step(project_root, facts, entrypoint_require:) ⇒ Object @@ -27368,29 +42923,47 @@

     
     
    -10787
    -10788
    -10789
    -10790
    -10791
    -10792
    -10793
    -10794
    -10795
    -10796
    +3900 +3901 +3902 +3903 +3904 +3905 +3906 +3907 +3908 +3909 +3910 +3911 +3912 +3913 +3914 +3915 +3916 +3917 +3918

    @@ -27398,9 +42971,9 @@

    -

    +

    - .framework_matrix_replaced_appraisal_names(dimension, entry, name) ⇒ Object + .legacy_rbs_signature_paths(project_root, entrypoint_require) ⇒ Object @@ -27412,21 +42985,25 @@

    -10730 -10731 -10732 -10733 -10734 -10735 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404

    @@ -27434,9 +43011,9 @@

    -

    +

    - .framework_matrix_version_entry(raw) ⇒ Object + .legacy_readme_top_logo_mode_options(value) ⇒ Object @@ -27448,59 +43025,35 @@

     
     
    -10761
    -10762
    -10763
    -10764
    -10765
    -10766
    -10767
    -10768
    -10769
    -10770
    -10771
    -10772
    -10773
    -10774
    -10775
    -10776
    -10777
    -10778
    -10779
    -10780
    -10781
    -10782
    -10783
    -10784
    -10785
    +8916 +8917 +8918 +8919 +8920 +8921 +8922 +8923 +8924 +8925 +8926 +8927 +8928

    @@ -27508,62 +43061,31 @@

    -

    - - .framework_matrix_workflow_enabled?(raw) ⇒ Boolean +

    - + .license_badge(spdx_id, ref: :license_ref) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -9973
    -9974
    -9975
    +8181 +8182 +8183 +8184 +8185 +8186 +8187 +8188 +8189 +8190 +8191 +8192 +8193 +8194 +8195
    -
    # File 'lib/kettle/jem.rb', line 9973
    +      
    # File 'lib/kettle/jem.rb', line 8181
     
    -def falsey_config?(value)
    -  %w[false no 0].include?(value.to_s.strip.downcase)
    +def insert_missing_gemspec_assignment_sources(content, replacements, receiver:)
    +  return content if replacements.empty?
    +
    +  present_fields = gemspec_assignment_records(content, receiver: receiver).map { |record| record.fetch(:field) }.to_set
    +  missing_sources = gemspec_preserved_assignment_fields.filter_map do |field|
    +    next if present_fields.include?(field)
    +
    +    source = replacements[field]
    +    "#{source}\n" if source
    +  end
    +  return content if missing_sources.empty?
    +
    +  first_dependency_line = gemspec_dependency_records(content, receiver: receiver).map { |record| record.fetch(:start_line) }.min
    +  insert_lines_before(content, first_dependency_line || gemspec_end_line(content), missing_sources.join)
     end
    -
    # File 'lib/kettle/jem.rb', line 7219
    +      
    # File 'lib/kettle/jem.rb', line 7744
     
    -def filter_recipe_pack(pack, template_selection)
    -  patterns = recipe_filter_patterns(template_selection)
    -  return pack if patterns.empty?
    +def insert_missing_gemspec_files_assignment(content, template_content:, template_receiver:)
    +  return content if gemspec_assignment_records(content, receiver: template_receiver).any? { |record| record.fetch(:field) == "files" }
     
    -  pack.merge(
    -    recipes: pack.fetch(:recipes).select { |recipe| selected_template_path?(recipe.fetch(:target_path), patterns) }
    -  )
    +  template_record = gemspec_assignment_records(template_content, receiver: template_receiver).find { |record| record.fetch(:field) == "files" }
    +  return content unless template_record
    +
    +  insertion = "#{normalize_gemspec_receiver(template_record.fetch(:source).rstrip, from: template_receiver, to: template_receiver)}\n"
    +  extra_rdoc = gemspec_assignment_records(content, receiver: template_receiver).find { |record| record.fetch(:field) == "extra_rdoc_files" }
    +  return insert_lines_before(content, extra_rdoc.fetch(:start_line), "\n#{insertion}") if extra_rdoc
    +
    +  anchor = %w[required_ruby_version licenses homepage description summary name].filter_map do |field|
    +    gemspec_assignment_records(content, receiver: template_receiver).find { |record| record.fetch(:field) == field }
    +  end.first
    +  return insert_lines_after(content, anchor.fetch(:end_line), "\n#{insertion}") if anchor
    +
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 4268
    +      
    # File 'lib/kettle/jem.rb', line 8523
     
    -def finalize_accepted_template_source(recipe, content, destination_content, facts:, project_root: nil)
    -  case template_file_type(recipe)
    -  when :gemfile
    -    finalize_gemfile_template_source(recipe, content, destination_content, facts: facts, template_content: content)
    -  when :appraisals
    -    merge_appraisals_template_policy(content, facts: facts)
    -  when :gemspec
    -    package_name = facts.dig(:package, :name).to_s if facts
    -    receiver = gemspec_block_param(content) || "spec"
    -    pruned = remove_gemspec_self_dependency_lines(content, package_name, receiver: receiver)
    -    rewrite_gemspec_version_loader(pruned, facts: facts)
    -  when :toml
    -    preserve_mise_project_settings(recipe, content, destination_content, project_root: project_root)
    -  else
    -    content
    -  end
    +def insert_missing_runtime_gemspec_dependency_lines(content, missing_lines, receiver:)
    +  return content if missing_lines.empty?
    +
    +  lines = content.to_s.lines
    +  insertion_index = runtime_gemspec_dependency_insertion_index(lines, receiver: receiver)
    +  lines.insert(insertion_index, *missing_lines)
    +  lines.join
     end
    -
    # File 'lib/kettle/jem.rb', line 4826
    +      
    # File 'lib/kettle/jem.rb', line 8968
     
    -def finalize_gemfile_template_source(recipe, content, destination_content, facts:, template_content:)
    -  output = merge_gemfile_template_policy(
    -    content,
    -    facts: facts,
    -    template_content: template_content,
    -    preserve_self_word_entries: local_gemfile_template_recipe?(recipe)
    -  )
    -  return output if recipe.dig(:template_preference, :strategy).to_s == "accept_template"
    -  return output unless local_gemfile_template_recipe?(recipe)
    +def insert_yaml_scalar_after_path(content, path, key, value)
    +  lines = content.to_s.lines
    +  scalar_entry = yaml_scalar_path_entries(content).find { |candidate| candidate.fetch(:path) == path }
    +  mapping_entry = yaml_mapping_path_entries(content).find { |candidate| candidate.fetch(:path) == path }
    +  entry = scalar_entry || mapping_entry
    +  return content unless entry
     
    -  merge_local_gem_overrides(output, destination_content, facts: facts, template_content: template_content)
    +  line_index = entry.key?(:line) ? entry.fetch(:line) : entry.fetch(:start_line)
    +  indent = lines[line_index].to_s[/\A\s*/].to_s
    +  scalar_path = path[0...-1] + [key]
    +  if mapping_entry && !scalar_entry
    +    indent = "#{indent}  "
    +    scalar_path = path + [key]
    +  end
    +  lines.insert(line_index + 1, "#{indent}#{key}: #{yaml_config_scalar_literal(value, path: scalar_path)}\n")
    +  lines.join
     end
    -
    # File 'lib/kettle/jem.rb', line 4928
    +      
    # File 'lib/kettle/jem.rb', line 2137
     
    -def finalize_github_workflow_template(content, facts = nil)
    -  inject_framework_matrix_workflow_env(update_github_actions_pins(content), facts)
    +def install_tasks
    +  require "rake"
    +  load(File.expand_path("jem/tasks.rb", __dir__))
     end
    -
    # File 'lib/kettle/jem.rb', line 4264
    +      
    # File 'lib/kettle/jem.rb', line 12828
     
    -def finalize_rubocop_config(content)
    -  remove_yaml_scalar_path(content, %w[AllCops TargetRubyVersion])
    +def integration_license_spdx(config, license)
    +  configured = if license.is_a?(Hash)
    +    license[:spdx] || license["spdx"]
    +  else
    +    []
    +  end
    +  configured = config["resolved_licenses"] if Array(configured).empty? && config.is_a?(Hash)
    +  Array(configured).map(&:to_s)
     end
    -
    # File 'lib/kettle/jem.rb', line 4258
    -
    -def finalize_template_source_content(recipe, content)
    -  return finalize_rubocop_config(content) if recipe.fetch(:target_path).to_s == ".rubocop.yml"
    +      
    # File 'lib/kettle/jem.rb', line 7152
     
    -  content
    +def json_merge_options(recipe)
    +  options = {
    +    preference: (recipe.dig(:template_preference, :preference) || "destination").to_sym,
    +    add_template_only_nodes: true,
    +    freeze_token: recipe.dig(:template_preference, :freeze_token) || "kettle-jem"
    +  }
    +  if !recipe.dig(:template_preference, :add_template_only_nodes).nil?
    +    configured = DecisionPolicy.value_to_boolean(recipe.dig(:template_preference, :add_template_only_nodes))
    +    options[:add_template_only_nodes] = configured unless configured.nil?
    +  end
    +  options
     end
    -
    # File 'lib/kettle/jem.rb', line 7124
    +      
    # File 'lib/kettle/jem.rb', line 13315
     
    -def first_grapheme(text)
    -  text.to_s.strip[/\A\X/u].to_s
    +def kettle_config_bootstrap_facts(project_root, env, template_selection: {})
    +  return if File.exist?(File.join(project_root, KETTLE_CONFIG_PATH))
    +  return if File.exist?(File.join(project_root, LEGACY_KETTLE_CONFIG_PATH))
    +
    +  selected_source = preferred_template_source(PACKAGED_TEMPLATE_ROOT, KETTLE_CONFIG_PATH)
    +  return unless selected_source
    +
    +  {
    +    template_preference: {
    +      target_path: KETTLE_CONFIG_PATH,
    +      configured_source: KETTLE_CONFIG_PATH,
    +      selected_source: selected_source,
    +      source_relative_path: selected_source,
    +      source_root: "packaged",
    +      source_root_path: PACKAGED_TEMPLATE_ROOT,
    +      selection_reason: template_source_selection_reason(KETTLE_CONFIG_PATH, selected_source),
    +      apply: true
    +    },
    +    min_divergence_threshold: preferred_template_token_value(nil, nil, env, "KJ_MIN_DIVERGENCE_THRESHOLD").to_s,
    +    template_profile: template_selection[:template_profile].to_s
    +  }.compact
     end
    -
    # File 'lib/kettle/jem.rb', line 8374
    +      
    # File 'lib/kettle/jem.rb', line 13338
     
    -def forge_facts(config, env, derived_github_user: nil)
    -  token_config = token_config_values(config)
    -  forge_config = token_config["forge"].is_a?(Hash) ? token_config["forge"] : {}
    -  compact_hash(
    -    gh_user: forge_user_value(forge_config, env, :gh_user, derived_value: derived_github_user).to_s,
    -    gl_user: forge_user_value(forge_config, env, :gl_user).to_s,
    -    cb_user: forge_user_value(forge_config, env, :cb_user).to_s,
    -    sh_user: forge_user_value(forge_config, env, :sh_user).to_s
    +def kettle_config_bootstrap_recipe(bootstrap)
    +  recipe = recipe_entry(
    +    "kettle_config_bootstrap",
    +    KETTLE_CONFIG_PATH,
    +    "yaml",
    +    "supplied_kettle_config_bootstrap",
    +    facts: %w[kettle_config_bootstrap]
       )
    +  recipe[:template_preference] = bootstrap.fetch(:template_preference)
    +  recipe[:template_tokens] = {
    +    "KJ|MIN_DIVERGENCE_THRESHOLD" => bootstrap.fetch(:min_divergence_threshold).to_s,
    +    "KJ|MIN_RUBY" => bootstrap[:min_ruby].to_s,
    +    "KJ|MIN_TEST_RUBY" => bootstrap[:test_min_ruby].to_s,
    +    "KJ|YARD_HOST" => bootstrap[:yard_host].to_s,
    +    "KJ|HOMEPAGE_URI" => bootstrap[:homepage_uri].to_s
    +  }
    +  recipe[:bootstrap_licenses] = Array(bootstrap[:licenses]).map(&:to_s).reject(&:empty?)
    +  recipe[:bootstrap_template_profile] = bootstrap[:template_profile].to_s unless bootstrap[:template_profile].to_s.empty?
    +  recipe[:bootstrap_gemspec_path] = bootstrap[:gemspec_path].to_s unless bootstrap[:gemspec_path].to_s.empty?
    +  recipe[:bootstrap_project_emoji] = bootstrap[:project_emoji].to_s unless bootstrap[:project_emoji].to_s.empty?
    +  recipe[:bootstrap_shim] = bootstrap[:shim] if bootstrap[:shim].is_a?(Hash)
    +  recipe
     end
    -
    # File 'lib/kettle/jem.rb', line 8389
    +      
    # File 'lib/kettle/jem.rb', line 9263
     
    -def forge_template_tokens(forge)
    -  {
    -    "KJ|GH:USER" => forge[:gh_user].to_s,
    -    "KJ|GL:USER" => forge[:gl_user].to_s,
    -    "KJ|CB:USER" => forge[:cb_user].to_s,
    -    "KJ|SH:USER" => forge[:sh_user].to_s
    -  }
    +def kettle_config_file_override_lines(path, strategy)
    +  parts = path.to_s.split("/")
    +  parts.each_with_index.flat_map do |part, index|
    +    indent = "  " * (index + 1)
    +    if index == parts.length - 1
    +      ["#{indent}#{part}:", "#{"  " * (index + 2)}strategy: #{strategy}"]
    +    else
    +      ["#{indent}#{part}:"]
    +    end
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 8385
    +      
    # File 'lib/kettle/jem.rb', line 3791
     
    -def forge_user_value(forge_config, env, key, derived_value: nil)
    -  preferred_template_token_value(derived_value, forge_config[key.to_s], env, FORGE_USER_ENV_KEYS.fetch(key))
    +def kettle_config_template_entries_lines(entries)
    +  ["  entries:", *entries.flat_map do |entry|
    +    if entry.is_a?(Hash)
    +      [
    +        "    - source: #{entry.fetch("source")}",
    +        "      target: #{entry.fetch("target")}"
    +      ]
    +    else
    +      ["    - #{entry}"]
    +    end
    +  end]
     end
    -
    # File 'lib/kettle/jem.rb', line 8355
    -
    -def format_copyright_years(years)
    -  sorted = Array(years).map(&:to_i).reject(&:zero?).sort.uniq
    -  return Time.now.utc.year.to_s if sorted.empty?
    -  return sorted.first.to_s if sorted.one?
    +      
    # File 'lib/kettle/jem.rb', line 11253
     
    -  runs = []
    -  run = [sorted.first]
    -  sorted[1..].to_a.each do |year|
    -    if year == run.last + 1
    -      run << year
    -    else
    -      runs << run
    -      run = [year]
    -    end
    -  end
    -  runs << run
    -  runs.map { |span| span.one? ? span.first.to_s : "#{span.first}-#{span.last}" }.join(", ")
    +def kettle_dev_local_gems(config)
    +  gems = %w[kettle-dev kettle-test kettle-soup-cover]
    +  plugin_names = PluginLoader.normalize_plugin_names(plugin_names_from_config(config))
    +  gems.concat(plugin_names.select { |plugin_name| plugin_name.start_with?("kettle-") })
    +  gems.uniq.join(" ")
     end
    -
    # File 'lib/kettle/jem.rb', line 10874
    +      
    # File 'lib/kettle/jem.rb', line 9937
     
    -def framework_gemfile_path(gemfile)
    -  gemfile.include?("/") ? gemfile : "gemfiles/#{gemfile}"
    +def kettle_jem_config(project_root)
    +  path = kettle_jem_config_path(project_root)
    +  return {} unless File.exist?(path)
    +
    +  config = YAML.safe_load_file(path, permitted_classes: [], aliases: false) || {}
    +  config = normalize_kettle_jem_config(config)
    +  validate_kettle_jem_config!(config)
    +  config
    +rescue Psych::SyntaxError => error
    +  raise Error, "Invalid #{kettle_jem_config_relative_path(project_root)}: #{error.message}"
     end
    -
    # File 'lib/kettle/jem.rb', line 5720
    +      
    # File 'lib/kettle/jem.rb', line 9965
     
    -def framework_matrix_appraisal_block(entry)
    -  lines = [
    -    %(appraise "#{entry.fetch(:name)}" do)
    -  ]
    -  entry.fetch(:eval_gemfiles).each do |gemfile|
    -    lines << %(  eval_gemfile "#{gemfile}")
    -  end
    -  lines << "end"
    -  lines.join("\n")
    +def kettle_jem_config_path(project_root)
    +  canonical = File.join(project_root, KETTLE_CONFIG_PATH)
    +  return canonical if File.exist?(canonical)
    +
    +  File.join(project_root, LEGACY_KETTLE_CONFIG_PATH)
     end
    -
    # File 'lib/kettle/jem.rb', line 5617
    +      
    # File 'lib/kettle/jem.rb', line 9972
     
    -def framework_matrix_appraisal_dependency_gemfiles(facts)
    -  framework_matrix = facts.to_h.dig(:ci, :framework_matrix).to_h
    -  [
    -    *framework_matrix.fetch(:appraisals, []).flat_map { |entry| entry.fetch(:eval_gemfiles, []) },
    -    *framework_matrix.fetch(:gemfiles, []).map { |entry| entry.fetch(:path).to_s.delete_prefix("gemfiles/") }
    -  ].map(&:to_s).to_set
    +def kettle_jem_config_relative_path(project_root)
    +  path = kettle_jem_config_path(project_root)
    +  File.expand_path(path).delete_prefix("#{File.expand_path(project_root.to_s)}/")
     end
    -
    # File 'lib/kettle/jem.rb', line 4963
    +      
    # File 'lib/kettle/jem.rb', line 13556
     
    -def framework_matrix_appraisal_env_by_name(facts)
    -  entries = facts.to_h.dig(:ci, :framework_matrix, :appraisals).to_a
    -  entries.to_h do |entry|
    -    env = {"KJ_FRAMEWORK_MATRIX_GEM" => entry.fetch(:gem).to_s}.merge(entry.fetch(:env, {}).transform_keys(&:to_s))
    -    [entry.fetch(:name).to_s, env.reject { |_key, value| value.to_s.empty? }]
    -  end.reject { |_name, env| env.empty? }
    +def known_license_template_basenames
    +  KNOWN_LICENSE_TEMPLATE_BASENAMES
     end
    -
    # File 'lib/kettle/jem.rb', line 10753
    +      
    # File 'lib/kettle/jem.rb', line 12626
     
    -def framework_matrix_appraisal_gemfile_path(path)
    -  path.to_s.sub(%r{\Agemfiles/}, "")
    +def large_business_license_cell(author_email)
    +  cell = license_link("LicenseRef-Big-Time-Public-License")
    +  if author_email.to_s.empty?
    +    "#{cell} or contact us for a custom license"
    +  else
    +    "#{cell} or [contact us](mailto:#{author_email}) for a custom license"
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 10746
    +      
    # File 'lib/kettle/jem.rb', line 6036
     
    -def framework_matrix_appraisal_gemfiles(raw)
    -  Array(raw["appraisal_gemfiles"] || raw["appraisal_eval_gemfiles"]).filter_map do |path|
    -    normalized = framework_matrix_appraisal_gemfile_path(path.to_s.strip)
    -    normalized unless normalized.empty?
    -  end
    +def leading_space_count(line)
    +  line.to_s.each_char.take_while { |char| char == " " }.count
     end
    -
    # File 'lib/kettle/jem.rb', line 10757
    +      
    # File 'lib/kettle/jem.rb', line 8714
     
    -def framework_matrix_appraisal_name(dimension, slug)
    -  [dimension, slug].join("-").downcase.gsub(/[^a-z0-9]+/, "-").gsub(/\A-|-+\z/, "")
    +def leading_whitespace(source)
    +  text = source.to_s
    +  text[0...(text.length - text.lstrip.length)]
     end
    -
    # File 'lib/kettle/jem.rb', line 10787
    -
    -def framework_matrix_env(raw)
    -  return {} unless raw.is_a?(Hash)
    +      
    # File 'lib/kettle/jem.rb', line 3900
     
    -  raw.each_with_object({}) do |(key, value), result|
    -    name = key.to_s.strip
    -    next if name.empty?
    +def legacy_rbs_consolidation_step(project_root, facts, entrypoint_require:)
    +  legacy_signature_paths = legacy_rbs_signature_paths(project_root, entrypoint_require)
    +  return if legacy_signature_paths.empty?
     
    -    result[name] = value.to_s
    -  end
    +  namespace = facts.dig(:rubygems, :namespace).to_s
    +  signature_path = File.join("sig", "#{entrypoint_require}.rbs")
    +  changes = write_consolidated_version_signature(
    +    project_root,
    +    signature_path,
    +    legacy_signature_paths,
    +    namespace: namespace
    +  ).compact
    +  {
    +    name: "legacy_rbs_consolidation",
    +    status: changes.empty? ? "already_current" : "applied",
    +    changed_files: changes,
    +    signature_path: signature_path
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 10730
    +      
    # File 'lib/kettle/jem.rb', line 11397
     
    -def framework_matrix_replaced_appraisal_names(dimension, entry, name)
    -  default_name = framework_matrix_appraisal_name(dimension, entry.fetch(:slug))
    -  return [] if default_name == name
    +def legacy_rbs_signature_paths(project_root, entrypoint_require)
    +  legacy_root = File.join(project_root, "sig", entrypoint_require.to_s)
    +  return [] unless Dir.exist?(legacy_root)
     
    -  [default_name]
    +  Dir.glob(File.join(legacy_root, "**", "*.rbs")).sort.map do |path|
    +    path.delete_prefix("#{project_root}/")
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 10761
    +      
    # File 'lib/kettle/jem.rb', line 8916
     
    -def framework_matrix_version_entry(raw)
    -  if raw.is_a?(Hash)
    -    label = raw.fetch("label", raw["version"]).to_s.strip
    -    slug = raw.fetch("slug", label).to_s.strip
    -    requirement = raw.fetch("requirement", default_framework_matrix_requirement(label)).to_s.strip
    -    appraisal_name = (raw["appraisal"] || raw["appraisal_name"] || raw["standard_appraisal"]).to_s.strip
    -    env = framework_matrix_env(raw["env"])
    -  else
    -    label = raw.to_s.strip
    -    slug = label
    -    requirement = default_framework_matrix_requirement(label)
    -    appraisal_name = ""
    -    env = {}
    -  end
    -  return if label.empty? || slug.empty? || requirement.empty?
    +def legacy_readme_top_logo_mode_options(value)
    +  raw = value.to_s.strip
    +  return [] if raw.empty?
     
    -  entry = {
    -    label: label,
    -    slug: slug,
    -    requirement: requirement
    -  }
    -  entry[:appraisal_name] = appraisal_name unless appraisal_name.empty?
    -  entry[:env] = env unless env.empty?
    -  entry
    +  normalized = raw.downcase.tr("-", "_").gsub(/\s*,\s*/, ",").tr(" ", "_")
    +  mapped = README_TOP_LOGO_LEGACY_MODE_MAP[normalized]
    +  return mapped if mapped
    +
    +  normalized.split(",").filter_map do |option|
    +    option = option.strip
    +    README_TOP_LOGO_OPTIONS.include?(option) ? option : nil
    +  end
     end
    +
    @@ -27571,9 +43093,9 @@

    -

    +

    - .freeze_marker_blocks(content, freeze_token: nil) ⇒ Object + .license_badge_img(spdx_id) ⇒ Object @@ -27583,51 +43105,19 @@

    @@ -27635,9 +43125,9 @@

    -

    +

    - .funding_platform_token_facts(config, env) ⇒ Object + .license_badge_ref(spdx_id) ⇒ Object @@ -27649,35 +43139,17 @@

     
     
    -8398
    -8399
    -8400
    -8401
    -8402
    -8403
    -8404
    -8405
    -8406
    -8407
    -8408
    -8409
    -8410
    +12510 +12511 +12512 +12513

    @@ -27685,9 +43157,9 @@

    -

    +

    - .funding_platform_token_value(funding_config, env, key) ⇒ Object + .license_compat_badge(category) ⇒ Object @@ -27699,15 +43171,17 @@

     
     
    -8412
    -8413
    -8414
    +12529 +12530 +12531 +12532

    @@ -27715,9 +43189,9 @@

    -

    +

    - .funding_template_tokens(funding) ⇒ Object + .license_compat_category(licenses) ⇒ Object @@ -27729,33 +43203,25 @@

     
     
    -8416
    -8417
    -8418
    -8419
    -8420
    -8421
    -8422
    -8423
    -8424
    -8425
    -8426
    -8427
    +12520 +12521 +12522 +12523 +12524 +12525 +12526 +12527

    @@ -27763,9 +43229,9 @@

    -

    +

    - .funding_urls(project_root, package_name, funding_uri: nil, opencollective_disabled: false, open_collective_org: nil) ⇒ Object + .license_compat_img(category) ⇒ Object @@ -27777,27 +43243,21 @@

     
     
    -7419
    -7420
    -7421
    -7422
    -7423
    -7424
    -7425
    -7426
    -7427
    +12582 +12583 +12584 +12585 +12586 +12587

    @@ -27805,9 +43265,9 @@

    -

    +

    - .gem_major_token(version) ⇒ Object + .license_compat_ref(category) ⇒ Object @@ -27819,19 +43279,15 @@

     
     
    -8140
    -8141
    -8142
    -8143
    -8144
    +12578 +12579 +12580

    @@ -27839,52 +43295,77 @@

    -

    +

    - .gemfile_comment_line?(line) ⇒ Boolean + .license_contact_line(author_email, context:) ⇒ Object -

    -
    - +

     
     
    -10737
    -10738
    -10739
    -10740
    -10741
    -10742
    -10743
    -10744
    +12505 +12506 +12507 +12508
    -
    # File 'lib/kettle/jem.rb', line 10737
    -
    -def framework_matrix_workflow_enabled?(raw)
    -  configured = raw["workflow"]
    -  configured = raw["generate_workflow"] if configured.nil?
    -  configured = raw["ci"] if configured.nil?
    -  return true if configured.nil?
    +      
    # File 'lib/kettle/jem.rb', line 12505
     
    -  DecisionPolicy.value_to_boolean(configured) != false
    +def license_badge(spdx_id, ref: :license_ref)
    +  base = spdx_basename(spdx_id)
    +  "[![License: #{base}][#{paperclip_ref(:license_img)}]][#{paperclip_ref(ref)}]"
     end
    -
    -
    -6322
    -6323
    -6324
    -6325
    -6326
    -6327
    -6328
    -6329
    -6330
    -6331
    -6332
    -6333
    -6334
    -6335
    -6336
    -6337
    -6338
    -6339
    -6340
    -6341
    + + +12515 +12516 +12517 +12518
    -
    # File 'lib/kettle/jem.rb', line 6322
    -
    -def freeze_marker_blocks(content, freeze_token: nil)
    -  marker = freeze_token.to_s.empty? ? "kettle-jem" : freeze_token.to_s
    -  lines = content.to_s.lines
    -  blocks = []
    -  index = 0
    -  while index < lines.length
    -    unless lines[index].include?("# #{marker}:freeze")
    -      index += 1
    -      next
    -    end
    +      
    # File 'lib/kettle/jem.rb', line 12515
     
    -    start_index = index
    -    while index < lines.length
    -      index += 1
    -      break if lines[index - 1].include?("# #{marker}:unfreeze")
    -    end
    -    blocks << lines[start_index...index]
    -  end
    -  blocks
    +def license_badge_img(spdx_id)
    +  base = spdx_basename(spdx_id).gsub("-", "--").gsub("_", "__").tr(" ", "_")
    +  "https://img.shields.io/badge/License-#{base}-259D6C.svg"
     end
    -
    # File 'lib/kettle/jem.rb', line 8398
    +      
    # File 'lib/kettle/jem.rb', line 12510
     
    -def funding_platform_token_facts(config, env)
    -  token_config = token_config_values(config)
    -  funding_config = token_config["funding"].is_a?(Hash) ? token_config["funding"] : {}
    -  compact_hash(
    -    patreon: funding_platform_token_value(funding_config, env, :patreon).to_s,
    -    kofi: funding_platform_token_value(funding_config, env, :kofi).to_s,
    -    paypal: funding_platform_token_value(funding_config, env, :paypal).to_s,
    -    buymeacoffee: funding_platform_token_value(funding_config, env, :buymeacoffee).to_s,
    -    polar: funding_platform_token_value(funding_config, env, :polar).to_s,
    -    liberapay: funding_platform_token_value(funding_config, env, :liberapay).to_s,
    -    issuehunt: funding_platform_token_value(funding_config, env, :issuehunt).to_s
    -  )
    +def license_badge_ref(spdx_id)
    +  base = spdx_basename(spdx_id)
    +  base.include?(" OR ") ? "LICENSE.md" : "#{base}.md"
     end
    -
    # File 'lib/kettle/jem.rb', line 8412
    +      
    # File 'lib/kettle/jem.rb', line 12529
     
    -def funding_platform_token_value(funding_config, env, key)
    -  preferred_template_token_value(nil, funding_config[key.to_s], env, FUNDING_TOKEN_ENV_KEYS.fetch(key))
    +def license_compat_badge(category)
    +  data = APACHE_LICENSE_COMPAT_BADGE_DATA.fetch(category)
    +  "[![#{data.fetch(:alt)}][#{paperclip_ref(:license_compat_img)}]][#{paperclip_ref(:license_compat)}]"
     end
    -
    # File 'lib/kettle/jem.rb', line 8416
    +      
    # File 'lib/kettle/jem.rb', line 12520
     
    -def funding_template_tokens(funding)
    -  platform_tokens = funding.fetch(:platform_tokens, {})
    -  {
    -    "KJ|FUNDING:PATREON" => platform_tokens[:patreon].to_s,
    -    "KJ|FUNDING:KOFI" => platform_tokens[:kofi].to_s,
    -    "KJ|FUNDING:PAYPAL" => platform_tokens[:paypal].to_s,
    -    "KJ|FUNDING:BUYMEACOFFEE" => platform_tokens[:buymeacoffee].to_s,
    -    "KJ|FUNDING:POLAR" => platform_tokens[:polar].to_s,
    -    "KJ|FUNDING:LIBERAPAY" => platform_tokens[:liberapay].to_s,
    -    "KJ|FUNDING:ISSUEHUNT" => platform_tokens[:issuehunt].to_s
    -  }
    +def license_compat_category(licenses)
    +  categories = Array(licenses).filter_map { |license| APACHE_LICENSE_COMPAT_CATEGORIES[license.to_s] }.uniq
    +  return :a if categories.include?(:a)
    +  return :b if categories.include?(:b)
    +  return :x if categories.any? && categories.all?(:x)
    +
    +  :unknown
     end
    -
    # File 'lib/kettle/jem.rb', line 7419
    +      
    # File 'lib/kettle/jem.rb', line 12582
     
    -def funding_urls(project_root, package_name, funding_uri: nil, opencollective_disabled: false, open_collective_org: nil)
    -  urls = [funding_uri]
    -  path = File.join(project_root, ".github", "FUNDING.yml")
    -  urls.concat(github_funding_urls(path, opencollective_disabled: opencollective_disabled)) if File.exist?(path)
    -  urls << github_funding_platform_urls("open_collective", [open_collective_org]).first unless opencollective_disabled
    -  urls << github_funding_platform_urls("tidelift", ["rubygems/#{package_name}"]).first
    -
    -  urls.compact.uniq.sort
    +def license_compat_img(category)
    +  data = APACHE_LICENSE_COMPAT_BADGE_DATA.fetch(category)
    +  normalize_generated_image_url(
    +    "https://img.shields.io/badge/#{data.fetch(:label)}-#{data.fetch(:message)}-#{data.fetch(:color)}.svg?style=flat&logo=Apache"
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 8140
    +      
    # File 'lib/kettle/jem.rb', line 12578
     
    -def gem_major_token(version)
    -  Gem::Version.new(version.to_s).segments.first.to_s
    -rescue ArgumentError
    -  "0"
    +def license_compat_ref(category)
    +  APACHE_LICENSE_COMPAT_BADGE_DATA.fetch(category).fetch(:ref)
     end
    + + + + +
    +
     
     
    -  
    +12473
    +12474
    +12475
    +12476
    +12477
    +12478
    +12479
    +12480
    +12481
    +12482
    +12483
    +
    +
    # File 'lib/kettle/jem.rb', line 12473
    +
    +def license_contact_line(author_email, context:)
    +  if author_email.to_s.empty?
    +    return "If none of the above licenses fit your use case, please contact the project maintainer to discuss a custom commercial license." if context == :license_md
    +
    +    "If none of the available licenses suit your use case, please contact the project maintainer to discuss a custom commercial license."
    +  elsif context == :license_md
    +    "If none of the above licenses fit your use case, please [contact us](mailto:#{author_email}) to discuss a custom commercial license."
    +  else
    +    "If none of the available licenses suit your use case, please [contact us](mailto:#{author_email}) to discuss a custom commercial license."
    +  end
    +end
    +
    -
    + +
    +
    + +
    @@ -27892,9 +43373,9 @@

    -

    +

    - .gemfile_declares_gem?(content, gem_name) ⇒ Boolean + .license_eye_compatible_licenses?(licenses) ⇒ Boolean @@ -27929,37 +43410,15 @@

     
     
    -3294
    -3295
    -3296
    -3297
    -3298
    -3299
    -3300
    -3301
    -3302
    -3303
    -3304
    -3305
    -3306
    -3307
    +12838 +12839 +12840

    @@ -27967,9 +43426,9 @@

    -

    +

    - .gemfile_dependency_insertion_line(content) ⇒ Object + .license_eye_dependency_license_entry(entry) ⇒ Object @@ -27981,27 +43440,45 @@

     
     
    -5207
    -5208
    -5209
    -5210
    -5211
    -5212
    -5213
    -5214
    -5215
    +12559 +12560 +12561 +12562 +12563 +12564 +12565 +12566 +12567 +12568 +12569 +12570 +12571 +12572 +12573 +12574 +12575 +12576

    @@ -28009,9 +43486,9 @@

    -

    +

    - .gemfile_dependency_names(content) ⇒ Object + .license_eye_dependency_licenses(config) ⇒ Object @@ -28023,15 +43500,25 @@

     
     
    -4129
    -4130
    -4131
    +12550 +12551 +12552 +12553 +12554 +12555 +12556 +12557

    @@ -28039,66 +43526,29 @@

    -

    - - .gemfile_dependency_statement?(node) ⇒ Boolean +

    - + .license_eye_flags(licenses) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -5428
    -5429
    -5430
    +12416 +12417 +12418 +12419
    -
    # File 'lib/kettle/jem.rb', line 5428
    +      
    # File 'lib/kettle/jem.rb', line 12416
     
    -def gemfile_comment_line?(line)
    -  line.to_s.lstrip.start_with?("#")
    +def license_copyright_notice(copyright_lines, copyright_prefix, author)
    +  lines = copyright_notice_lines(copyright_lines, copyright_prefix, author).map { |line| "- #{line}" }
    +  "## Copyright Notice\n\n#{lines.join("\n")}"
     end
    -
    # File 'lib/kettle/jem.rb', line 3294
    +      
    # File 'lib/kettle/jem.rb', line 12838
     
    -def gemfile_declares_gem?(content, gem_name)
    -  ruby_call_records(content, nil).any? do |call|
    -    next false unless call.receiver.nil?
    -
    -    case call.name
    -    when :gem
    -      ruby_string_argument(call) == gem_name.to_s
    -    when :gemspec
    -      gemspec_path_declares_gem?(ruby_keyword_string_argument(call, :path), gem_name)
    -    else
    -      false
    -    end
    -  end
    +def license_eye_compatible_licenses?(licenses)
    +  Array(licenses).map(&:to_s).any? { |license_id| LICENSE_EYE_COMPATIBILITY_LICENSES.include?(license_id) }
     end
    -
    # File 'lib/kettle/jem.rb', line 5207
    +      
    # File 'lib/kettle/jem.rb', line 12559
     
    -def gemfile_dependency_insertion_line(content)
    -  body = prism_parse_success(content)&.value&.statements&.body || []
    -  node = body.find do |statement|
    -    gemfile_dependency_statement?(statement)
    +def license_eye_dependency_license_entry(entry)
    +  data = if entry.is_a?(Hash)
    +    entry
    +  else
    +    {}
       end
    -  return content.to_s.lines.length unless node
    +  name = data["name"] || data[:name]
    +  license = data["license"] || data[:license]
    +  version = data["version"] || data[:version]
    +  return if name.to_s.strip.empty? || license.to_s.strip.empty?
     
    -  node.location.start_line - 1
    +  lines = [
    +    "    - name: #{JSON.generate(name.to_s.strip)}",
    +    "      license: #{JSON.generate(license.to_s.strip)}"
    +  ]
    +  lines.insert(1, "      version: #{JSON.generate(version.to_s.strip)}") unless version.to_s.strip.empty?
    +  lines
     end
    -
    # File 'lib/kettle/jem.rb', line 4129
    +      
    # File 'lib/kettle/jem.rb', line 12550
     
    -def gemfile_dependency_names(content)
    -  gemfile_gem_call_records(content).map { |record| record.fetch(:name) }
    +def license_eye_dependency_licenses(config)
    +  entries = Array(config.dig("license_eye", "dependency_licenses")).filter_map do |entry|
    +    license_eye_dependency_license_entry(entry)
    +  end
    +  return "" if entries.empty?
    +
    +  ["  licenses:", *entries].join("\n")
     end
    +
    @@ -28106,9 +43556,9 @@

    -

    +

    - .gemfile_eval_bucket_entries(content) ⇒ Object + .license_eye_mode(licenses) ⇒ Object @@ -28120,45 +43570,15 @@

     
     
    -5539
    -5540
    -5541
    -5542
    -5543
    -5544
    -5545
    -5546
    -5547
    -5548
    -5549
    -5550
    -5551
    -5552
    -5553
    -5554
    -5555
    -5556
    +12542 +12543 +12544

    @@ -28166,9 +43586,9 @@

    -

    +

    - .gemfile_gem_call_records(content) ⇒ Object + .license_eye_primary_spdx(licenses, fallback) ⇒ Object @@ -28180,33 +43600,15 @@

     
     
    -5325
    -5326
    -5327
    -5328
    -5329
    -5330
    -5331
    -5332
    -5333
    -5334
    -5335
    -5336
    +12538 +12539 +12540

    @@ -28214,9 +43616,9 @@

    -

    +

    - .gemfile_paragraphs(content) ⇒ Object + .license_eye_workflow_badge(licenses, config = {}) ⇒ Object @@ -28228,15 +43630,15 @@

     
     
    -5188
    -5189
    -5190
    +12534 +12535 +12536

    @@ -28244,9 +43646,9 @@

    -

    +

    - .gemfile_percent_w_names(content) ⇒ Object + .license_facts(config, gemspec_licenses, author: {}, author_email: nil, copyright: {}) ⇒ Object @@ -28258,15 +43660,59 @@

     
     
    -5192
    -5193
    -5194
    +12356 +12357 +12358 +12359 +12360 +12361 +12362 +12363 +12364 +12365 +12366 +12367 +12368 +12369 +12370 +12371 +12372 +12373 +12374 +12375 +12376 +12377 +12378 +12379 +12380

    @@ -28274,9 +43720,9 @@

    -

    +

     
     
    -4028
    -4029
    -4030
    -4031
    -4032
    -4033
    -4034
    -4035
    -4036
    -4037
    -4038
    -4039
    +12500 +12501 +12502 +12503

    @@ -28322,9 +43752,9 @@

    -

    +

    - .gemspec_assignment_end_line(call) ⇒ Object + .license_md_content(licenses, author_email: nil) ⇒ Object @@ -28336,21 +43766,37 @@

     
     
    -6513
    -6514
    -6515
    -6516
    -6517
    -6518
    +12441 +12442 +12443 +12444 +12445 +12446 +12447 +12448 +12449 +12450 +12451 +12452 +12453 +12454

    @@ -28358,9 +43804,9 @@

    -

    +

    - .gemspec_assignment_field(call) ⇒ Object + .license_template_tokens(license) ⇒ Object @@ -28372,23 +43818,47 @@

     
     
    -6520
    -6521
    -6522
    -6523
    -6524
    -6525
    -6526
    +12391 +12392 +12393 +12394 +12395 +12396 +12397 +12398 +12399 +12400 +12401 +12402 +12403 +12404 +12405 +12406 +12407 +12408 +12409

    @@ -28396,9 +43866,9 @@

    -

    +

    - .gemspec_assignment_records(source, receiver: nil) ⇒ Object + .license_use_case_guide_table(licenses, author_email: nil) ⇒ Object @@ -28410,45 +43880,33 @@

     
     
    -6494
    -6495
    -6496
    -6497
    -6498
    -6499
    -6500
    -6501
    -6502
    -6503
    -6504
    -6505
    -6506
    -6507
    -6508
    -6509
    -6510
    -6511
    +12597 +12598 +12599 +12600 +12601 +12602 +12603 +12604 +12605 +12606 +12607 +12608

    @@ -28456,9 +43914,9 @@

    -

    +

    - .gemspec_assignment_value(call) ⇒ Object + .license_use_case_rows(licenses, author_email: nil) ⇒ Object @@ -28470,31 +43928,39 @@

     
     
    -6528
    -6529
    -6530
    -6531
    -6532
    -6533
    -6534
    -6535
    -6536
    -6537
    -6538
    +12610 +12611 +12612 +12613 +12614 +12615 +12616 +12617 +12618 +12619 +12620 +12621 +12622 +12623 +12624

    @@ -28502,9 +43968,9 @@

    -

    +

    - .gemspec_block_param(source) ⇒ Object + .load_project_gemspec(gemspec_path) ⇒ Object @@ -28516,19 +43982,19 @@

     
     
    -6205
    -6206
    -6207
    -6208
    -6209
    +11224 +11225 +11226 +11227 +11228

    @@ -28536,35 +44002,52 @@

    -

    +

    - .gemspec_dependency_call_kind(call) ⇒ Object + .local_gemfile_template_recipe?(recipe) ⇒ Boolean -

     
     
    -5217
    -5218
    -5219
    -5220
    -5221
    -5222
    -5223
    -5224
    -5225
    -5226
    +12546 +12547 +12548
    -
    # File 'lib/kettle/jem.rb', line 5217
    +      
    # File 'lib/kettle/jem.rb', line 12546
     
    -def gemfile_dependency_statement?(node)
    -  case node
    -  when ::Prism::CallNode
    -    %i[gem group platforms].include?(node.name)
    -  when ::Prism::IfNode, ::Prism::UnlessNode
    -    true
    -  else
    -    false
    -  end
    +def license_eye_flags(licenses)
    +  (license_eye_mode(licenses) == "check") ? "--weak-compatible" : ""
     end
    -
    # File 'lib/kettle/jem.rb', line 5539
    -
    -def gemfile_eval_bucket_entries(content)
    -  lines = content.to_s.lines
    -  ruby_call_records(content, :eval_gemfile).filter_map do |call|
    -    path = ruby_string_argument(call)
    -    next unless path
    -
    -    key = normalize_eval_gemfile_ruby_bucket(path)
    -    next unless key
    +      
    # File 'lib/kettle/jem.rb', line 12542
     
    -    {
    -      path: path,
    -      key: key,
    -      line: (lines[(call.location.start_line - 1)..(call.location.end_line - 1)] || []).join,
    -      start_line: call.location.start_line,
    -      end_line: call.location.end_line
    -    }
    -  end
    +def license_eye_mode(licenses)
    +  (Array(licenses).map(&:to_s).any? { |license| LICENSE_EYE_COMPATIBILITY_LICENSES.include?(license) }) ? "check" : "resolve"
     end
    -
    # File 'lib/kettle/jem.rb', line 5325
    -
    -def gemfile_gem_call_records(content)
    -  ruby_call_records(content, :gem).filter_map do |call|
    -    name = ruby_string_argument(call)
    -    next unless name
    +      
    # File 'lib/kettle/jem.rb', line 12538
     
    -    {
    -      name: name,
    -      start_line: call.location.start_line,
    -      end_line: call.location.end_line
    -    }
    -  end
    +def license_eye_primary_spdx(licenses, fallback)
    +  Array(licenses).map(&:to_s).find { |license| LICENSE_EYE_COMPATIBILITY_LICENSES.include?(license) } || fallback
     end
    -
    # File 'lib/kettle/jem.rb', line 5188
    +      
    # File 'lib/kettle/jem.rb', line 12534
     
    -def gemfile_paragraphs(content)
    -  content.to_s.split(/\n{2,}/).map { |paragraph| ensure_trailing_newline(paragraph.strip) }.reject { |paragraph| paragraph.strip.empty? }
    +def license_eye_workflow_badge(licenses, config = {})
    +  disabled_integrations(config, license: {spdx: licenses}).include?(SKYWALKING_EYES_INTEGRATION) ? "" : README_LICENSE_EYE_WORKFLOW_BADGE
     end
    -
    # File 'lib/kettle/jem.rb', line 5192
    +      
    # File 'lib/kettle/jem.rb', line 12356
     
    -def gemfile_percent_w_names(content)
    -  ruby_word_array_records(content).flat_map { |record| record.fetch(:names) }.reject(&:empty?)
    +def license_facts(config, gemspec_licenses, author: {}, author_email: nil, copyright: {})
    +  licenses = resolved_licenses(config, gemspec_licenses)
    +  primary = licenses.first
    +  compat_category = license_compat_category(licenses)
    +  copyright_prefix = polyform_licenses?(licenses) ? "Required Notice: " : ""
    +  copyright_lines = Array(copyright[:lines])
    +  compact_hash(
    +    spdx: licenses,
    +    expression: licenses.join(" OR "),
    +    primary_spdx: primary,
    +    license_md_content: license_md_content(licenses, author_email: author_email),
    +    readme_license_intro: readme_license_intro(licenses, author_email: author_email),
    +    readme_license_badge: license_badge(licenses.join(" OR "), ref: :license),
    +    readme_license_compat_badge: license_compat_badge(compat_category),
    +    readme_license_eye_workflow_badge: license_eye_workflow_badge(licenses, config),
    +    readme_license_refs: readme_license_refs(licenses.join(" OR "), compat_category),
    +    license_eye_primary_spdx: license_eye_primary_spdx(licenses, primary),
    +    license_eye_mode: license_eye_mode(licenses),
    +    license_eye_flags: license_eye_flags(licenses),
    +    license_eye_dependency_licenses: license_eye_dependency_licenses(config),
    +    license_copyright_notice: license_copyright_notice(copyright_lines, copyright_prefix, author),
    +    readme_copyright_notice: readme_copyright_notice(copyright_lines, copyright_prefix, author),
    +    copyright_prefix: copyright_prefix
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 4028
    +      
    # File 'lib/kettle/jem.rb', line 12500
     
    -def gemfile_policy_operations(template_content, original, final, request)
    -  package_name = runtime_context_value(request, :package, :name).to_s
    -  deleted = gemfile_dependency_names("#{template_content}\n#{original}") - gemfile_dependency_names(final)
    -  expected = ["appraisal"]
    -  expected << package_name unless package_name.empty?
    -  [
    -    {
    -      operation: "delete_dependency_declarations",
    -      deleted_gems: (deleted & expected).sort
    -    }
    -  ]
    +def license_link(spdx_id)
    +  base = spdx_basename(spdx_id)
    +  "[#{base}](#{base}.md)"
     end
    -
    # File 'lib/kettle/jem.rb', line 6513
    +      
    # File 'lib/kettle/jem.rb', line 12441
     
    -def gemspec_assignment_end_line(call)
    -  argument = call.arguments&.arguments&.first
    -  closing_line = argument.respond_to?(:closing_loc) && argument.closing_loc&.end_line
    -  closing_line = nil unless closing_line.is_a?(Integer)
    -  [call.location.end_line, closing_line].compact.max
    +def license_md_content(licenses, author_email: nil)
    +  content = <<~MARKDOWN.chomp
    +    # License
    +
    +    This project is made available under the following license#{"s" if licenses.size > 1}.
    +    Choose the option that best fits your use case:
    +
    +    #{licenses.map { |license| "- #{license_link(license)}" }.join("\n")}
    +  MARKDOWN
    +  guide_table = license_use_case_guide_table(licenses, author_email: author_email)
    +  content += "\n\n## Use-case guide\n\n#{guide_table}" if guide_table
    +  content += "\n\n#{license_contact_line(author_email, context: :license_md)}" if non_mit_licenses?(licenses)
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 6520
    -
    -def gemspec_assignment_field(call)
    -  name = call.name.to_s
    -  return unless name.end_with?("=")
    -  return if name == "[]="
    +      
    # File 'lib/kettle/jem.rb', line 12391
     
    -  name.delete_suffix("=")
    +def license_template_tokens(license)
    +  {
    +    "KJ|LICENSE_MD_CONTENT" => license[:license_md_content].to_s,
    +    "KJ|GEMSPEC:ROOT_LICENSE_FILES" => gemspec_root_license_files_token(license),
    +    "KJ|README:LICENSE_INTRO" => license[:readme_license_intro].to_s,
    +    "KJ|LICENSE:PRIMARY_SPDX" => license[:primary_spdx].to_s,
    +    "KJ|LICENSE_EYE:PRIMARY_SPDX" => license[:license_eye_primary_spdx].to_s,
    +    "KJ|LICENSE_EYE:MODE" => license[:license_eye_mode].to_s,
    +    "KJ|LICENSE_EYE:FLAGS" => license[:license_eye_flags].to_s,
    +    "KJ|LICENSE_EYE:DEPENDENCY_LICENSES" => license[:license_eye_dependency_licenses].to_s,
    +    "KJ|README:LICENSE_BADGE" => license[:readme_license_badge].to_s,
    +    "KJ|README:LICENSE_COMPAT_BADGE" => license[:readme_license_compat_badge].to_s,
    +    "KJ|README:LICENSE_EYE_WORKFLOW_BADGE" => license[:readme_license_eye_workflow_badge].to_s,
    +    "KJ|README:LICENSE_REFS" => license[:readme_license_refs].to_s,
    +    "KJ|LICENSE_COPYRIGHT_NOTICE" => license[:license_copyright_notice].to_s,
    +    "KJ|README:COPYRIGHT_NOTICE" => license[:readme_copyright_notice].to_s,
    +    "KJ|COPYRIGHT_PREFIX" => license[:copyright_prefix].to_s
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 6494
    -
    -def gemspec_assignment_records(source, receiver: nil)
    -  lines = source.to_s.lines
    -  ruby_call_records(source, nil).filter_map do |call|
    -    field = gemspec_assignment_field(call)
    -    next unless field
    -    next if receiver && call.receiver&.slice != receiver.to_s
    -    end_line = gemspec_assignment_end_line(call)
    +      
    # File 'lib/kettle/jem.rb', line 12597
     
    -    {
    -      field: field,
    -      value: gemspec_assignment_value(call),
    -      receiver: call.receiver&.slice,
    -      start_line: call.location.start_line,
    -      end_line: end_line,
    -      source: (lines[(call.location.start_line - 1)..(end_line - 1)] || []).join
    -    }
    -  end
    +def license_use_case_guide_table(licenses, author_email: nil)
    +  has_floss_oss = licenses.include?("MIT") || licenses.include?("AGPL-3.0-only")
    +  has_polyform = licenses.include?("PolyForm-Noncommercial-1.0.0") || licenses.include?("PolyForm-Small-Business-1.0.0")
    +  has_big_time = licenses.include?("LicenseRef-Big-Time-Public-License")
    +  return unless has_floss_oss && has_polyform && has_big_time
    +
    +  rows = license_use_case_rows(licenses, author_email: author_email)
    +  return if rows.empty?
    +
    +  "| Use case | License |\n|---|---|\n" +
    +    rows.map { |use_case, license| "| #{use_case} | #{license} |" }.join("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 6528
    +      
    # File 'lib/kettle/jem.rb', line 12610
     
    -def gemspec_assignment_value(call)
    -  argument = call.arguments&.arguments&.first
    -  case argument
    -  when ::Prism::StringNode
    -    argument.unescaped
    -  when ::Prism::ArrayNode
    -    argument.elements.filter_map { |element| element.unescaped if element.is_a?(::Prism::StringNode) }
    -  else
    -    argument&.slice
    -  end
    +def license_use_case_rows(licenses, author_email: nil)
    +  rows = []
    +  rows << ["FLOSS (free and open source)", license_link("MIT")] if licenses.include?("MIT")
    +  rows << ["Copy-left open source", license_link("AGPL-3.0-only")] if licenses.include?("AGPL-3.0-only")
    +  noncommercial_links = %w[PolyForm-Noncommercial-1.0.0 PolyForm-Small-Business-1.0.0 LicenseRef-Big-Time-Public-License]
    +    .select { |license| licenses.include?(license) }
    +    .map { |license| license_link(license) }
    +  rows << ["Non-commercial (research, education, personal use)", noncommercial_links.join(" or ")] unless noncommercial_links.empty?
    +  small_business_links = %w[PolyForm-Small-Business-1.0.0 LicenseRef-Big-Time-Public-License]
    +    .select { |license| licenses.include?(license) }
    +    .map { |license| license_link(license) }
    +  rows << ["Small business commercial", small_business_links.join(" or ")] unless small_business_links.empty?
    +  rows << ["Larger business commercial", large_business_license_cell(author_email)] if licenses.include?("LicenseRef-Big-Time-Public-License")
    +  rows
     end
    -
    # File 'lib/kettle/jem.rb', line 6205
    +      
    # File 'lib/kettle/jem.rb', line 11224
     
    -def gemspec_block_param(source)
    -  call = gemspec_new_call(source)
    -  required = call&.block&.parameters&.parameters&.requireds&.first
    -  required&.name&.to_s
    +def load_project_gemspec(gemspec_path)
    +  Gem::Specification.load(gemspec_path)
    +rescue LoadError, StandardError
    +  nil
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -28572,9 +44055,9 @@

    -

    +

    - .gemspec_dependency_from_record(record) ⇒ Object + .local_gems_assignment(content) ⇒ Object @@ -28586,15 +44069,15 @@

     
     
    -8535
    -8536
    -8537
    +6173 +6174 +6175

    @@ -28602,9 +44085,9 @@

    -

    +

    - .gemspec_dependency_line_index(source, receiver:) ⇒ Object + .local_gems_assignment_record(content) ⇒ Object @@ -28616,20 +44099,40 @@

     
     
    -6430
    -6431
    -6432
    -6433
    -6434
    -6435
    +6188 +6189 +6190 +6191 +6192 +6193 +6194 +6195 +6196 +6197 +6198 +6199 +6200 +6201 +6202 +6203

    @@ -28638,9 +44141,9 @@

    -

    +

    - .gemspec_dependency_line_key(line, receiver:) ⇒ Object + .local_modular_eval_paths_for_gem(project_root, gem_name) ⇒ Object @@ -28652,17 +44155,41 @@

     
     
    -6462
    -6463
    -6464
    -6465
    +10966 +10967 +10968 +10969 +10970 +10971 +10972 +10973 +10974 +10975 +10976 +10977 +10978 +10979 +10980 +10981

    @@ -28670,9 +44197,9 @@

    -

    +

    - .gemspec_dependency_names(source) ⇒ Object + .local_modular_runtime_eval_paths(project_root, gemspec_metadata, package_name:) ⇒ Object @@ -28684,15 +44211,31 @@

     
     
    -6437
    -6438
    -6439
    +10954 +10955 +10956 +10957 +10958 +10959 +10960 +10961 +10962 +10963 +10964

    @@ -28700,9 +44243,9 @@

    -

    +

    - .gemspec_dependency_record_key(record) ⇒ Object + .main_gemfile_after_gemspec_line(content) ⇒ Object @@ -28714,15 +44257,15 @@

     
     
    -6467
    -6468
    -6469
    +5678 +5679 +5680

    @@ -28730,9 +44273,9 @@

    -

    +

    - .gemspec_dependency_record_version(record) ⇒ Object + .main_gemfile_direct_sibling_block(gems, source_url:, project_root:, local_modular_eval_paths: []) ⇒ Object @@ -28744,27 +44287,163 @@

     
     
    -6484
    -6485
    -6486
    -6487
    -6488
    -6489
    -6490
    -6491
    -6492
    +11020 +11021 +11022 +11023 +11024 +11025 +11026 +11027 +11028 +11029 +11030 +11031 +11032 +11033 +11034 +11035 +11036 +11037 +11038 +11039 +11040 +11041 +11042 +11043 +11044 +11045 +11046 +11047 +11048 +11049 +11050 +11051 +11052 +11053 +11054 +11055 +11056 +11057 +11058 +11059 +11060 +11061 +11062 +11063 +11064 +11065 +11066 +11067 +11068 +11069 +11070 +11071 +11072 +11073 +11074 +11075 +11076 +11077 +11078 +11079 +11080 +11081 +11082 +11083 +11084 +11085 +11086 +11087 +11088 +11089 +11090 +11091 +11092 +11093 +11094 +11095 +11096

    @@ -28772,9 +44451,9 @@

    -

    +

    - .gemspec_dependency_records(source, receiver: nil) ⇒ Object + .main_gemfile_direct_sibling_records(content) ⇒ Object @@ -28786,52 +44465,52 @@

     
     
    -6586
    -6587
    -6588
    -6589
    -6590
    -6591
    -6592
    -6593
    -6594
    -6595
    -6596
    -6597
    -6598
    -6599
    -6600
    -6601
    -6602
    -6603
    -6604
    -6605
    -6606
    -6607
    +5595 +5596 +5597 +5598 +5599 +5600 +5601 +5602 +5603 +5604 +5605 +5606 +5607 +5608 +5609 +5610 +5611 +5612 +5613 +5614 +5615 +5616

    @@ -28840,9 +44519,9 @@

    -

    +

    - .gemspec_dependency_sort_key(name) ⇒ Object + .main_gemfile_first_eval_gemfile_line(content) ⇒ Object @@ -28854,15 +44533,15 @@

     
     
    -6364
    -6365
    -6366
    +5674 +5675 +5676

    @@ -28870,70 +44549,51 @@

    -

    - - .gemspec_dependency_source_newer?(candidate_source, current_source, receiver:) ⇒ Boolean +

    - + .main_gemfile_nomono_bootstrap(package_name) ⇒ Object -

    -
    - - -
    -
    -
    -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • - -
    - -

     
     
    -6609
    -6610
    -6611
    -6612
    -6613
    -6614
    +6136 +6137 +6138
    -
    # File 'lib/kettle/jem.rb', line 6609
    +      
    # File 'lib/kettle/jem.rb', line 6136
     
    -def gemspec_dependency_call_kind(call)
    -  case call.name
    -  when :add_dependency, :add_runtime_dependency, :add_development_dependency
    -    call.name.to_s
    -  end
    +def local_gemfile_template_recipe?(recipe)
    +  recipe.fetch(:target_path).to_s.end_with?("_local.gemfile")
     end
    -
    # File 'lib/kettle/jem.rb', line 8535
    +      
    # File 'lib/kettle/jem.rb', line 6173
     
    -def gemspec_dependency_from_record(record)
    -  Gem::Dependency.new(record.fetch(:name), *record.fetch(:requirements), (record.fetch(:kind) == "add_development_dependency") ? :development : :runtime)
    +def local_gems_assignment(content)
    +  local_gems_assignment_record(content)&.fetch(:names) || []
     end
    -
    # File 'lib/kettle/jem.rb', line 6430
    +      
    # File 'lib/kettle/jem.rb', line 6188
     
    -def gemspec_dependency_line_index(source, receiver:)
    -  gemspec_dependency_records(source, receiver: receiver).each_with_object({}) do |record, dependencies|
    -    key = gemspec_dependency_record_key(record)
    -    dependencies[key] ||= record.fetch(:source)
    +def local_gems_assignment_record(content)
    +  result = prism_parse_success(content)
    +  return unless result
    +
    +  result.value.breadth_first_search_all do |node|
    +    node.is_a?(::Prism::LocalVariableWriteNode) &&
    +      node.name == :local_gems &&
    +      ruby_word_array_node?(node.value)
    +  end.first&.then do |node|
    +    {
    +      names: ruby_word_array_names(node.value),
    +      start_line: node.location.start_line,
    +      end_line: node.location.end_line
    +    }
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 6462
    +      
    # File 'lib/kettle/jem.rb', line 10966
     
    -def gemspec_dependency_line_key(line, receiver:)
    -  record = gemspec_dependency_records(line, receiver: receiver).first
    -  gemspec_dependency_record_key(record) if record
    +def local_modular_eval_paths_for_gem(project_root, gem_name)
    +  Dir.glob(File.join(project_root.to_s, "gemfiles", "modular", "**", "*_local.gemfile")).filter_map do |path|
    +    next unless gemfile_dependency_names(File.read(path)).include?(gem_name.to_s)
    +
    +    local_relative = project_relative_path(path, project_root)
    +    paired_relative = paired_modular_gemfile_path(local_relative)
    +    next unless paired_relative
    +    next unless File.file?(File.join(project_root.to_s, paired_relative))
    +
    +    paired_relative
    +  rescue Errno::ENOENT
    +    nil
    +  end
    +    .uniq
    +    .sort
     end
    -
    # File 'lib/kettle/jem.rb', line 6437
    +      
    # File 'lib/kettle/jem.rb', line 10954
     
    -def gemspec_dependency_names(source)
    -  gemspec_dependency_records(source).map { |record| record.fetch(:name) }
    +def local_modular_runtime_eval_paths(project_root, , package_name:)
    +  return {} unless project_root && .is_a?(Hash)
    +
    +  runtime_names = gemspec_runtime_dependency_names() - [package_name.to_s]
    +  return {} if runtime_names.empty?
    +
    +  runtime_names.each_with_object({}) do |gem_name, paths_by_gem|
    +    paths = local_modular_eval_paths_for_gem(project_root, gem_name)
    +    paths_by_gem[gem_name] = paths if paths.any?
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 6467
    +      
    # File 'lib/kettle/jem.rb', line 5678
     
    -def gemspec_dependency_record_key(record)
    -  [record.fetch(:kind), record.fetch(:name)]
    +def main_gemfile_after_gemspec_line(content)
    +  ruby_call_records(content, :gemspec).map { |call| ruby_node_source_end_line(call) + 1 }.min
     end
    -
    # File 'lib/kettle/jem.rb', line 6484
    +      
    # File 'lib/kettle/jem.rb', line 11020
     
    -def gemspec_dependency_record_version(record)
    -  versions = record.fetch(:requirements, []).filter_map do |requirement|
    -    version_text = requirement.to_s[/\d+(?:[._-]?[A-Za-z0-9]+)*/]
    -    Gem::Version.new(version_text.tr("_", ".")) if version_text
    -  rescue ArgumentError
    -    nil
    +def main_gemfile_direct_sibling_block(gems, source_url:, project_root:, local_modular_eval_paths: [])
    +  names = Array(gems).map(&:to_s).reject(&:empty?).uniq
    +  eval_paths = Array(local_modular_eval_paths).map(&:to_s).reject(&:empty?).uniq.sort
    +  return "" if names.empty? && eval_paths.empty?
    +
    +  blocks = []
    +  if eval_paths.any?
    +    blocks << [
    +      "# Modular sibling dependencies (env-switched inside each modular Gemfile)",
    +      *eval_paths.map { |path| %(eval_gemfile "#{path}") }
    +    ].join("\n")
       end
    -  versions.max || Gem::Version.new("0")
    +  return blocks.join("\n\n") if names.empty?
    +
    +  workspace_slug = direct_sibling_workspace_slug(source_url, project_root)
    +  prefix = workspace_slug.to_s.upcase.tr("-", "_")
    +  prefix = "LOCAL" if prefix.empty?
    +  dev_env = "#{prefix}_DEV"
    +  root_literal = ruby_array_literal(["src", "my", workspace_slug].reject(&:empty?))
    +  word_array = names.map { |name| "  #{name}" }.join("\n")
    +
    +  blocks << <<~RUBY.rstrip
    +    # Direct sibling dependencies (env-switched via #{dev_env})
    +    direct_sibling_gems = %w[
    +    #{word_array}
    +    ]
    +    direct_sibling_dev = ENV.fetch("#{dev_env}", "")
    +    direct_sibling_local =
    +      !direct_sibling_dev.empty? && !%w[false 0 no off].include?(direct_sibling_dev.downcase)
    +    direct_sibling_templating = ENV.fetch("K_JEM_TEMPLATING", "false").casecmp("true").zero?
    +
    +    if direct_sibling_gems.any? &&
    +        (direct_sibling_local ||
    +          ENV.fetch("K_JEM_TEMPLATING", "false").casecmp("true").zero?)
    +      direct_sibling_dev_was_set = ENV.key?("#{dev_env}")
    +      direct_sibling_dev_original = ENV.fetch("#{dev_env}", nil)
    +      begin
    +        nomono_activation_requirements = nomono_requirements
    +        nomono_lockfile = File.expand_path("Gemfile.lock", __dir__)
    +        if File.file?(nomono_lockfile)
    +          nomono_locked_spec = Bundler::LockfileParser
    +            .new(Bundler.read_file(nomono_lockfile))
    +            .specs
    +            .find { |spec| spec.name == "nomono" }
    +          nomono_locked = nomono_locked_spec &&
    +            Gem::Requirement.new(nomono_requirements).satisfied_by?(nomono_locked_spec.version)
    +          if nomono_locked
    +            nomono_activation_requirements = ["= \#{nomono_locked_spec.version}"]
    +          end
    +        end
    +        Kernel.send(:gem, "nomono", *nomono_activation_requirements)
    +        require "nomono/bundler"
    +        if direct_sibling_templating && !direct_sibling_local
    +          ENV["#{dev_env}"] = File.expand_path("..", __dir__)
    +        end
    +
    +        eval_nomono_gems(
    +          gems: direct_sibling_gems,
    +          prefix: "#{prefix}",
    +          path_env: "#{dev_env}",
    +          root: #{root_literal}
    +        )
    +      rescue LoadError
    +        warn "Install nomono to enable #{dev_env} local sibling-gem dependencies."
    +      ensure
    +        if direct_sibling_templating && !direct_sibling_local
    +          if direct_sibling_dev_was_set
    +            ENV["#{dev_env}"] = direct_sibling_dev_original
    +          else
    +            ENV.delete("#{dev_env}")
    +          end
    +        end
    +      end
    +    end
    +  RUBY
    +  blocks.join("\n\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 6586
    +      
    # File 'lib/kettle/jem.rb', line 5595
     
    -def gemspec_dependency_records(source, receiver: nil)
    -  lines = source.to_s.lines
    -  ruby_call_records(source, nil).filter_map do |call|
    -    kind = gemspec_dependency_call_kind(call)
    -    next unless kind
    -    next if receiver && call.receiver&.slice != receiver.to_s
    +def main_gemfile_direct_sibling_records(content)
    +  body = prism_parse_success(content)&.value&.statements&.body || []
    +  assignments = body.select do |node|
    +    node.is_a?(::Prism::LocalVariableWriteNode) && node.name == :direct_sibling_gems
    +  end
    +  return [] if assignments.empty?
     
    -    name = ruby_string_argument(call)
    -    next unless name
    +  lines = content.to_s.lines
    +  assignments.filter_map do |assignment|
    +    block_if = body.find do |node|
    +      node.is_a?(::Prism::IfNode) &&
    +        node.location.start_line > assignment.location.end_line &&
    +        prism_subtree_contains_call?(node, :eval_nomono_gems)
    +    end
    +    next unless block_if
     
    -    {
    -      kind: kind,
    -      name: name,
    -      requirement: ruby_string_argument_at(call, 1),
    -      requirements: ruby_string_arguments(call).drop(1),
    -      receiver: call.receiver&.slice,
    -      start_line: call.location.start_line,
    -      end_line: call.location.end_line,
    -      source: (lines[(call.location.start_line - 1)..(call.location.end_line - 1)] || []).join
    -    }
    +    start_line = assignment.location.start_line
    +    previous = lines[start_line - 2].to_s
    +    start_line -= 1 if previous.strip.start_with?("# Direct sibling dependencies")
    +    {start_line: start_line, end_line: block_if.location.end_line}
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 6364
    +      
    # File 'lib/kettle/jem.rb', line 5674
     
    -def gemspec_dependency_sort_key(name)
    -  name.to_s.tr("_", "-")
    +def main_gemfile_first_eval_gemfile_line(content)
    +  ruby_call_records(content, :eval_gemfile).map { |call| call.location.start_line }.min
     end
    +
     
     
    -6476
    -6477
    -6478
    -6479
    -6480
    -6481
    -6482
    +11260 +11261 +11262 +11263 +11264 +11265 +11266 +11267 +11268
    -
    # File 'lib/kettle/jem.rb', line 6476
    +      
    # File 'lib/kettle/jem.rb', line 11260
     
    -def gemspec_dependency_source_newer?(candidate_source, current_source, receiver:)
    -  candidate = gemspec_dependency_records(candidate_source, receiver: receiver).first
    -  current = gemspec_dependency_records(current_source, receiver: receiver).first
    -  return false unless candidate && current
    +def main_gemfile_nomono_bootstrap(package_name)
    +  return "" if package_name.to_s == "nomono"
     
    -  gemspec_dependency_record_version(candidate) > gemspec_dependency_record_version(current)
    -end
    + <<~RUBY.rstrip + # Local workspace dependency wiring for *_local.gemfile overrides + nomono_requirements = ["~> 1.0", ">= 1.0.8"] + gem "nomono", *nomono_requirements, require: false # ruby >= 2.2 + RUBY +end
    -

    +

    - .gemspec_end_line(source) ⇒ Object + .main_gemfile_nomono_bootstrap_source(template_content) ⇒ Object @@ -28945,15 +44605,33 @@

     
     
    -6620
    -6621
    -6622
    +5653 +5654 +5655 +5656 +5657 +5658 +5659 +5660 +5661 +5662 +5663 +5664

    -
    # File 'lib/kettle/jem.rb', line 6620
    +      
    # File 'lib/kettle/jem.rb', line 5653
     
    -def gemspec_end_line(source)
    -  gemspec_new_call(source)&.location&.end_line || source.to_s.lines.length + 1
    +def main_gemfile_nomono_bootstrap_source(template_content)
    +  records = main_gemfile_nomono_requirement_records(template_content)
    +  assignment = records.fetch(:assignments).first
    +  call = records.fetch(:calls).first
    +  return "" unless assignment && call
    +
    +  lines = template_content.to_s.lines
    +  start_line = assignment.fetch(:start_line)
    +  previous = lines[start_line - 2].to_s
    +  start_line -= 1 if previous.strip.start_with?("# Local workspace dependency wiring")
    +  lines[(start_line - 1)..(call.fetch(:end_line) - 1)].join.rstrip + "\n\n"
     end
    -
    # File 'lib/kettle/jem.rb', line 6540
    +      
    # File 'lib/kettle/jem.rb', line 5704
     
    -def gemspec_field_receiver_and_name(field)
    -  parts = field.to_s.split(".")
    -  return [nil, field.to_s] if parts.length == 1
    +def main_gemfile_nomono_requirement_records(content)
    +  body = prism_parse_success(content)&.value&.statements&.body || []
    +  assignments = body.filter_map do |node|
    +    next unless node.is_a?(::Prism::LocalVariableWriteNode) && node.name == :nomono_requirements
     
    -  [parts[0...-1].join("."), parts.last]
    +    {
    +      start_line: node.location.start_line,
    +      end_line: ruby_node_source_end_line(node),
    +      source: node.location.slice
    +    }
    +  end
    +  calls = ruby_call_records(content, :gem).filter_map do |call|
    +    next unless ruby_string_argument(call) == "nomono"
    +
    +    {
    +      start_line: call.location.start_line,
    +      end_line: ruby_node_source_end_line(call)
    +    }
    +  end
    +  {assignments: assignments, calls: calls.sort_by { |record| record.fetch(:start_line) }}
     end
    -
    # File 'lib/kettle/jem.rb', line 5994
    -
    -def gemspec_legacy_version_loader_block(entrypoint_require:, namespace:, min_ruby:)
    -  legacy_require =
    -    if min_ruby >= REQUIRE_RELATIVE_MIN_RUBY
    -      %(require_relative "lib/#{entrypoint_require}/version")
    -    else
    -      <<~RUBY.chomp
    -        # NOTE: Use __FILE__ or __dir__ until removal of Ruby 1.x support
    -        # __dir__ introduced in Ruby 1.9.1
    -        lib = File.expand_path("lib", File.dirname(__FILE__))
    -        $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
    -        require "#{entrypoint_require}/version"
    -      RUBY
    -    end
    -
    -  <<~RUBY
    -    gem_version =
    -      if Gem.ruby_version >= Gem::Version.new("3.1")
    -        # Loading Version into an anonymous module allows version.rb to get code coverage from SimpleCov!
    -        # See: https://github.com/simplecov-ruby/simplecov/issues/557#issuecomment-2630782358
    -        # See: https://github.com/panorama-ed/memo_wise/pull/397
    -        #{gemspec_modern_version_loader_expression(entrypoint_require: entrypoint_require, namespace: namespace)}
    -      else
    -        #{legacy_require.gsub("\n", "\n    ")}
    -        #{namespace}::Version::VERSION
    -      end
    -  RUBY
    -end
    +
    # File 'lib/kettle/jem.rb', line 6486
    +
    +def main_gemfile_recording_eval_path
    +  "gemfiles/modular/recording/r4/recording.gemfile"
    +end
    -

    +

    - .gemspec_legacy_version_loader_preamble_line_range(content) ⇒ Object + .main_gemfile_recording_insertion_index(content) ⇒ Object @@ -29089,47 +44749,27 @@

    -6034 -6035 -6036 -6037 -6038 -6039 -6040 -6041 -6042 -6043 -6044 -6045 -6046 -6047 -6048 -6049 -6050 -6051 -6052 +6476 +6477 +6478 +6479 +6480 +6481 +6482 +6483 +6484 -
    # File 'lib/kettle/jem.rb', line 6034
    +      
    # File 'lib/kettle/jem.rb', line 6476
     
    -def gemspec_legacy_version_loader_preamble_line_range(content)
    +def main_gemfile_recording_insertion_index(content)
       lines = content.to_s.lines
    -  start_index = lines.index do |line|
    -    # Prism has represented this legacy multiline assignment inconsistently across
    -    # parser versions; this fallback is limited to the exact top-level preamble
    -    # shape immediately preceding Gem::Specification.new.
    -    line.match?(/\Agem_version\s*=/)
    +  call = ruby_call_records(content, :eval_gemfile).find do |candidate|
    +    ruby_string_argument(candidate).to_s == "gemfiles/modular/style.gemfile"
       end
    -  return unless start_index
    -
    -  gemspec_index = lines.each_with_index.find do |line, index|
    -    index > start_index && line.include?("Gem::Specification.new")
    -  end&.last
    -  return unless gemspec_index
    +  return unless call
     
    -  end_line = gemspec_index
    -  end_line -= 1 while end_line > start_index && lines[end_line - 1].strip.empty?
    -  {start_line: start_index + 1, end_line: end_line}
    +  gemfile_eval_comment_start_line(lines, call.location.start_line) - 1
     end
    @@ -29137,9 +44777,9 @@

    -

    +

    - .gemspec_modern_version_loader_expression(entrypoint_require:, namespace:) ⇒ Object + .main_gemfile_templating_eval_line(content) ⇒ Object @@ -29151,15 +44791,23 @@

    -5990 -5991 -5992

    +5666 +5667 +5668 +5669 +5670 +5671 +5672 -
    # File 'lib/kettle/jem.rb', line 5990
    +      
    # File 'lib/kettle/jem.rb', line 5666
     
    -def gemspec_modern_version_loader_expression(entrypoint_require:, namespace:)
    -  %(Module.new.tap { |mod| Kernel.load("\#{__dir__}/lib/#{entrypoint_require}/version.rb", mod) }::#{namespace}::Version::VERSION)
    +def main_gemfile_templating_eval_line(content)
    +  ruby_call_records(content, :eval_gemfile).filter_map do |call|
    +    next unless ruby_string_argument(call) == "gemfiles/modular/templating.gemfile"
    +
    +    call.location.start_line
    +  end.min
     end
    @@ -29167,9 +44815,9 @@

    -

    +

    - .gemspec_new_call(source) ⇒ Object + .managed_license_template_basename(target_path) ⇒ Object @@ -29181,15 +44829,27 @@

     
     
    -6616
    -6617
    -6618
    +13546 +13547 +13548 +13549 +13550 +13551 +13552 +13553 +13554

    -
    # File 'lib/kettle/jem.rb', line 6616
    +      
    # File 'lib/kettle/jem.rb', line 13546
     
    -def gemspec_new_call(source)
    -  ruby_call_records(source, :new).find { |call| call.receiver&.slice == "Gem::Specification" }
    +def managed_license_template_basename(target_path)
    +  path = target_path.to_s
    +  return unless path.end_with?(".md")
    +
    +  basename = File.basename(path, ".md")
    +  return if NON_LICENSE_MD_BASENAMES.include?(basename)
    +
    +  known_license_template_basenames.include?(basename) ? basename : nil
     end
    @@ -29197,9 +44857,9 @@

    -

    +

    - .gemspec_path_declares_gem?(path, gem_name) ⇒ Boolean + .markdown_heading_has_preserved_readme_ancestor?(heading_sections, index) ⇒ Boolean @@ -29234,17 +44894,33 @@

     
     
    -3309
    -3310
    -3311
    -3312
    +5271 +5272 +5273 +5274 +5275 +5276 +5277 +5278 +5279 +5280 +5281 +5282 -
    # File 'lib/kettle/jem.rb', line 3309
    +      
    # File 'lib/kettle/jem.rb', line 5271
     
    -def gemspec_path_declares_gem?(path, gem_name)
    -  normalized_path = path.to_s.delete_suffix("/")
    -  normalized_path == "gems/#{gem_name}"
    +def markdown_heading_has_preserved_readme_ancestor?(heading_sections, index)
    +  owner = heading_sections.fetch(index)
    +  ancestor_level = owner.level.to_i
    +  heading_sections[0...index].reverse_each do |candidate|
    +    next unless candidate.level.to_i < ancestor_level
    +
    +    return true if README_DEFAULT_PRESERVE_SECTIONS.include?(candidate.base.to_s)
    +
    +    ancestor_level = candidate.level.to_i
    +  end
    +  false
     end
    @@ -29252,9 +44928,9 @@

    -

    +

    - .gemspec_policy_operations(template_content, original, final, request) ⇒ Object + .markdown_heading_owners(content, source_label: "README.md") ⇒ Object @@ -29266,85 +44942,23 @@

     
     
    -4063
    -4064
    -4065
    -4066
    -4067
    -4068
    -4069
    -4070
    -4071
    -4072
    -4073
    -4074
    -4075
    -4076
    -4077
    -4078
    -4079
    -4080
    -4081
    -4082
    -4083
    -4084
    -4085
    -4086
    -4087
    -4088
    -4089
    -4090
    -4091
    -4092
    -4093
    -4094
    -4095
    -4096
    -4097
    -4098
    -4099
    -4100
    +5390 +5391 +5392 +5393 +5394 +5395 +5396 -
    # File 'lib/kettle/jem.rb', line 4063
    +      
    # File 'lib/kettle/jem.rb', line 5390
     
    -def gemspec_policy_operations(template_content, original, final, request)
    -  template_receiver = gemspec_block_param(template_content) || "spec"
    -  destination_receiver = gemspec_block_param(original) || "spec"
    -  package_name = runtime_context_value(request, :package, :name).to_s
    -  self_dependency_names = gemspec_self_dependency_names(request, package_name)
    -  operations = [
    -    {
    -      operation: "preserve_project_fields",
    -      preserved_fields: gemspec_preserved_assignments(original, receiver: destination_receiver).keys.select do |field|
    -        final.include?("#{template_receiver}.#{field} =")
    -      end.sort
    -    },
    -    {
    -      operation: "preserve_dependency_declarations",
    -      preserved_dependencies: gemspec_dependency_line_index(original, receiver: destination_receiver).keys.map(&:last).select do |gem_name|
    -        final.include?(%("#{gem_name}"))
    -      end.sort
    -    },
    -    {
    -      operation: "delete_self_dependency_declarations",
    -      deleted_dependency_count: [
    -        gemspec_dependency_names("#{template_content}\n#{original}").count { |name| self_dependency_names.include?(name) } -
    -          gemspec_dependency_names(final).count { |name| self_dependency_names.include?(name) },
    -        0
    -      ].max
    -    }
    -  ]
    -  version_loader_operation = gemspec_version_loader_policy_operation(original, final, request)
    -  operations << version_loader_operation if version_loader_operation
    -  if template_receiver != destination_receiver
    -    operations << {
    -      operation: "normalize_gemspec_receiver",
    -      from: destination_receiver,
    -      to: template_receiver
    -    }
    -  end
    -  operations
    +def markdown_heading_owners(content, source_label: "README.md")
    +  ensure_runtime_dependencies!
    +  context = Ast::Crispr::Markdown::Markly.document_context(content: content.to_s, source_label: source_label)
    +  context.structural_owners(owner_scope: :heading_sections)
    +rescue Ast::Crispr::Error
    +  []
     end
    @@ -29352,9 +44966,9 @@

    -

    +

     
     
    -6242
    -6243
    -6244
    -6245
    -6246
    -6247
    -6248
    -6249
    -6250
    -6251
    -6252
    -6253
    -6254
    -6255
    -6256
    -6257
    -6258
    -6259
    -6260
    -6261
    -6262
    +5342 +5343 +5344 +5345 +5346 -
    # File 'lib/kettle/jem.rb', line 6242
    +      
    # File 'lib/kettle/jem.rb', line 5342
     
    -def gemspec_preserved_assignments(source, receiver:)
    -  preserved_fields = %w[
    -    name
    -    authors
    -    email
    -    summary
    -    description
    -    homepage
    -    licenses
    -    required_ruby_version
    -    executables
    -  ]
    -  gemspec_assignment_records(source, receiver: receiver).each_with_object({}) do |record, assignments|
    -    field = record.fetch(:field)
    -    next unless preserved_fields.include?(field)
    -    next if assignments.key?(field)
    -    next if record.fetch(:source).include?("TODO:")
    +def markdown_link_definition_source(owner, url)
    +  source = "[#{owner.label}]: #{url}"
    +  source = "#{source} #{owner.title.dump}" if owner.title
    +  "#{source}\n"
    +end
    + + + +

    + +
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + @@ -29418,9 +45053,9 @@

    -

    +

    - .gemspec_project_emoji(gemspec_metadata) ⇒ Object + .markdown_managed_block(content, marker) ⇒ Object @@ -29432,29 +45067,35 @@

     
     
    -7113
    -7114
    -7115
    -7116
    -7117
    -7118
    -7119
    -7120
    -7121
    -7122
    +13041 +13042 +13043 +13044 +13045 +13046 +13047 +13048 +13049 +13050 +13051 +13052 +13053

    @@ -29462,9 +45103,9 @@

    -

    +

    - .gemspec_runtime_floor_token(facts) ⇒ Object + .markdown_sections(content) ⇒ Object @@ -29476,23 +45117,73 @@

     
     
    -6169
    -6170
    -6171
    -6172
    -6173
    -6174
    -6175
    +13055 +13056 +13057 +13058 +13059 +13060 +13061 +13062 +13063 +13064 +13065 +13066 +13067 +13068 +13069 +13070 +13071

    + +
    +
    +
    +
    +4340
    +4341
    +4342
    +
    +
    # File 'lib/kettle/jem.rb', line 4340
    +
    +def markdown_link_reference_definition_line?(line)
    +  line.to_s.lstrip.start_with?("[") && line.to_s.include?("]:")
     end
    -
    # File 'lib/kettle/jem.rb', line 7113
    +      
    # File 'lib/kettle/jem.rb', line 13041
     
    -def gemspec_project_emoji()
    -  [
    -    (, :summary),
    -    (, :description)
    -  ].each do |value|
    -    candidate = first_grapheme(value)
    -    return candidate if decorative_grapheme?(candidate)
    -  end
    -  nil
    +def markdown_managed_block(content, marker)
    +  ensure_runtime_dependencies!
    +  open = "<!-- #{marker}:start -->"
    +  close = "<!-- #{marker}:end -->"
    +  context = Ast::Crispr::Markdown::Markly.document_context(content: content.to_s, source_label: "managed markdown block")
    +  target = Ast::Crispr::Markdown::Markly::Selectors.html_comment_block(
    +    start_text: open.delete_prefix("<!-- ").delete_suffix(" -->"),
    +    end_text: close.delete_prefix("<!-- ").delete_suffix(" -->"),
    +    span: :outermost,
    +    limit: {none_or_one: true}
    +  )
    +  target.locate_matches(context).first&.slice_from(content.to_s)
     end
    -
    # File 'lib/kettle/jem.rb', line 6169
    +      
    # File 'lib/kettle/jem.rb', line 13055
     
    -def gemspec_runtime_floor_token(facts)
    -  raw = facts.to_h.dig(:rubygems, :min_ruby).to_s.strip
    -  token = minimum_ruby_token(raw)
    -  return "0" if token.empty? && raw == "0"
    +def markdown_sections(content)
    +  lines = content.to_s.split("\n", -1)
    +  markdown_heading_owners(content, source_label: "README.md").map do |owner|
    +    start = owner.location.start_line - 1
    +    branch_end = owner.location.end_line - 1
    +    body = (lines[(start + 1)..branch_end] || []).join("\n")
    +    {
    +      start: start,
    +      level: owner.level,
    +      heading: owner.heading_source,
    +      heading_text: owner.heading_text,
    +      base: owner.base,
    +      end: branch_end,
    +      body: body
    +    }
    +  end
    +end
    +
    +
    + +
    +

    + + .markdown_source_lines(content) ⇒ Object + - token + + + +

    + + + @@ -29500,9 +45191,9 @@

    -

    +

    - .gemspec_self_dependency_names(request, package_name) ⇒ Object + .merge_appraisal_blocks_with_prism(template_block, destination_block) ⇒ Object @@ -29514,21 +45205,37 @@

     
     
    -6441
    -6442
    -6443
    -6444
    -6445
    -6446
    +7261 +7262 +7263 +7264 +7265 +7266 +7267 +7268 +7269 +7270 +7271 +7272 +7273 +7274

    @@ -29536,9 +45243,9 @@

    -

    +

    - .gemspec_top_level_gem_version_node(content) ⇒ Object + .merge_appraisals_template_policy(content, facts:) ⇒ Object @@ -29550,31 +45257,29 @@

     
     
    -6065
    -6066
    -6067
    -6068
    -6069
    -6070
    -6071
    -6072
    -6073
    -6074
    -6075
    +6980 +6981 +6982 +6983 +6984 +6985 +6986 +6987 +6988 +6989

    @@ -29582,9 +45287,9 @@

    -

    +

    - .gemspec_version_loader_policy_operation(original, final, request) ⇒ Object + .merge_bash_template_source(template_content, destination_content, recipe) ⇒ Object @@ -29596,43 +45301,55 @@

    -4102 -4103 -4104 -4105 -4106 -4107 -4108 -4109 -4110 -4111 -4112 -4113 -4114 -4115 -4116 -4117 -4118 +7237 +7238 +7239 +7240 +7241 +7242 +7243 +7244 +7245 +7246 +7247 +7248 +7249 +7250 +7251 +7252 +7253 +7254 +7255 +7256 +7257 +7258 +7259

    @@ -29640,9 +45357,9 @@

    -

    +

    - .generated_blocks_facts(gemspec, facts, run_options) ⇒ Object + .merge_changelog_template_source(template_content, destination_content, facts: nil) ⇒ Object @@ -29654,17 +45371,97 @@

     
     
    -2982
    -2983
    -2984
    -2985
    +4261 +4262 +4263 +4264 +4265 +4266 +4267 +4268 +4269 +4270 +4271 +4272 +4273 +4274 +4275 +4276 +4277 +4278 +4279 +4280 +4281 +4282 +4283 +4284 +4285 +4286 +4287 +4288 +4289 +4290 +4291 +4292 +4293 +4294 +4295 +4296 +4297 +4298 +4299 +4300 +4301 +4302 +4303 +4304

    @@ -29672,9 +45469,9 @@

    -

    +

    - .generated_kettle_config_without_templates?(config) ⇒ Boolean + .merge_config_template_source(recipe, template_content, destination_content, facts: nil, env: ENV) ⇒ Object @@ -29689,13 +45486,13 @@

    -

    Returns:

    -
      +

      Raises:

      +
      • - (Boolean) + (ArgumentError) @@ -29709,80 +45506,147 @@

        -10223 -10224 -10225 -10226 -10227 +5474 +5475 +5476 +5477 +5478 +5479 +5480 +5481 +5482 +5483 +5484 +5485 +5486 +5487 +5488 +5489 +5490 +5491 +5492 +5493 +5494 +5495 +5496 +5497 +5498 +5499 +5500 +5501 +5502 +5503 +5504 +5505 +5506 +5507 +5508 +5509 +5510 +5511 +5512 +5513 +5514 +5515 +5516 +5517 +5518 +5519 +5520 +5521 +5522 +5523 +5524 +5525 +5526 +5527 +5528 +5529 +5530 +5531 +5532 +5533 +5534 +5535 +5536 +5537 +5538 +5539 +5540 +5541 +5542

    - -
    +
    +
    +
    +4306
    +4307
    +4308
    +
    +
    # File 'lib/kettle/jem.rb', line 4306
    +
    +def markdown_source_lines(content)
    +  content.to_s.split("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 6441
    +      
    # File 'lib/kettle/jem.rb', line 7261
     
    -def gemspec_self_dependency_names(request, package_name)
    -  names = [package_name.to_s]
    -  token_value = runtime_context_value(request, :template_tokens, "KJ|GEM_NAME")
    -  names << "{KJ|GEM_NAME}" if token_value.to_s == package_name.to_s
    -  names.reject(&:empty?).uniq
    +def merge_appraisal_blocks_with_prism(template_block, destination_block)
    +  result = Prism::Merge.merge_ruby(
    +    template_block,
    +    destination_block,
    +    "ruby",
    +    preference: :destination,
    +    add_template_only_nodes: true,
    +    signature_generator: Prism::Merge.ruby_dsl_signature_generator,
    +    method_move_policy: ruby_method_move_policy({}),
    +    merge_template_requires: true,
    +    template_only_placement: :after_anchor
    +  )
    +  result[:ok] ? result.fetch(:output) : template_block
     end
    -
    # File 'lib/kettle/jem.rb', line 6065
    +      
    # File 'lib/kettle/jem.rb', line 6980
     
    -def gemspec_top_level_gem_version_node(content)
    -  context = Ast::Crispr::Ruby::Prism.document_context(content: content.to_s, source_label: "gemspec")
    -  gemspec_call = context.structural_owners(owner_scope: :top_level_statements).find do |owner|
    -    owner.is_a?(::Prism::CallNode) && owner.name == :new && owner.receiver&.slice == "Gem::Specification"
    -  end
    -  context.structural_owners(owner_scope: :top_level_statements).find do |owner|
    -    owner.is_a?(::Prism::LocalVariableWriteNode) &&
    -      owner.name == :gem_version &&
    -      (!gemspec_call || owner.location.start_offset < gemspec_call.location.start_offset)
    -  end
    +def merge_appraisals_template_policy(content, facts:)
    +  package_name = facts.dig(:package, :name).to_s if facts
    +  min_ruby = minimum_ruby_token(facts.dig(:ci, :test_min_ruby) || facts.dig(:rubygems, :min_ruby)) if facts
    +  with_framework_appraisals = merge_framework_matrix_appraisals(content, facts)
    +  with_standard_appraisal_gemfiles = inject_standard_appraisal_gemfiles(with_framework_appraisals, facts)
    +  pruned = prune_appraisals_recording_entries(with_standard_appraisal_gemfiles, facts)
    +  pruned = prune_appraisals_below_min_ruby(pruned, min_ruby)
    +  pruned = remove_gemfile_dependency_lines(pruned, [package_name])
    +  remove_gemfile_percent_w_entries(pruned, [package_name])
     end
    -
    # File 'lib/kettle/jem.rb', line 4102
    +      
    # File 'lib/kettle/jem.rb', line 7237
     
    -def gemspec_version_loader_policy_operation(original, final, request)
    -  min_ruby = minimum_ruby_token(runtime_context_value(request, :rubygems, :min_ruby))
    -  return if min_ruby.to_s.empty?
    +def merge_bash_template_source(template_content, destination_content, recipe)
    +  availability = Bash::Merge.availability(source: template_content.to_s)
    +  unless availability.available?
    +    return {
    +      ok: false,
    +      output: destination_content,
    +      diagnostics: [{
    +        kind: "bash_merge_unavailable",
    +        message: "bash structural merge is unavailable because TreeHaver node parser support for Bash is not available",
    +        details: availability.diagnostics
    +      }]
    +    }
    +  end
     
    -  modern = Gem::Version.new(min_ruby) >= MODERN_GEMSPEC_VERSION_LOADER_MIN_RUBY
    -  before_legacy = !gemspec_top_level_gem_version_node(original).nil?
    -  after_legacy = !gemspec_top_level_gem_version_node(final).nil?
    -  {
    -    operation: "rewrite_version_loader",
    -    min_ruby: min_ruby,
    -    mode: modern ? "modern" : "legacy",
    -    legacy_preamble_removed: before_legacy && !after_legacy,
    -    legacy_preamble_present: after_legacy
    -  }
    -rescue ArgumentError, Ast::Crispr::Error
    -  nil
    +  output = Bash::Merge::SmartMerger.new(
    +    template_content,
    +    destination_content,
    +    **bash_merge_options(recipe)
    +  ).merge
    +  {ok: true, output: output, diagnostics: []}
    +rescue Bash::Merge::Error => e
    +  {ok: false, output: destination_content, diagnostics: [{kind: "bash_merge_failed", message: e.message}]}
     end
    -
    # File 'lib/kettle/jem.rb', line 2982
    +      
    # File 'lib/kettle/jem.rb', line 4261
     
    -def generated_blocks_facts(gemspec, facts, run_options)
    -  shunted = shunted_gemfile_block(gemspec, facts, run_options)
    -  shunted ? {shunted_gemfile: shunted} : {}
    +def merge_changelog_template_source(template_content, destination_content, facts: nil)
    +  destination = destination_content.to_s
    +  if destination.strip.empty?
    +    return apply_changelog_transfer_entries(
    +      ensure_trailing_newline(template_content.to_s),
    +      facts.to_h.dig(:changelog, :transfer_entries)
    +    )
    +  end
    +
    +  template_lines = markdown_source_lines(template_content)
    +  template_unreleased = changelog_unreleased_line_index(template_lines)
    +  unless template_unreleased
    +    return apply_changelog_transfer_entries(
    +      ensure_trailing_newline(template_content.to_s),
    +      facts.to_h.dig(:changelog, :transfer_entries)
    +    )
    +  end
    +
    +  destination_lines = markdown_source_lines(destination)
    +  destination_unreleased = changelog_unreleased_line_index(destination_lines)
    +  unless destination_unreleased
    +    header = changelog_template_header(template_lines, template_unreleased).join("\n")
    +    return apply_changelog_transfer_entries(
    +      ensure_trailing_newline("#{header}\n\n#{destination}"),
    +      facts.to_h.dig(:changelog, :transfer_entries)
    +    )
    +  end
    +
    +  destination_end = changelog_unreleased_end_index(destination_lines, destination_unreleased)
    +  destination_body = destination_lines[(destination_unreleased + 1)...destination_end] || []
    +  canonical = build_changelog_unreleased_section(
    +    template_lines.fetch(template_unreleased),
    +    changelog_unreleased_items(destination_body)
    +  )
    +  header = changelog_template_header(template_lines, template_unreleased)
    +  merged_lines = header +
    +    (header.empty? ? [] : [""]) +
    +    canonical +
    +    destination_lines[destination_end..].to_a
    +  apply_changelog_transfer_entries(
    +    ensure_trailing_newline(merged_lines.join("\n").gsub(/\n{3,}/, "\n\n")),
    +    facts.to_h.dig(:changelog, :transfer_entries)
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 10223
    -
    -def generated_kettle_config_without_templates?(config)
    -  return false unless config.is_a?(Hash)
    -
    -  config["tokens"].is_a?(Hash)
    -end
    -
    -
    - -
    -

    - - .generated_or_obsolete_github_workflow?(relative_path) ⇒ Boolean - +
    # File 'lib/kettle/jem.rb', line 5474
     
    -  
    -
    -  
    -

    -
    - +def merge_config_template_source(recipe, template_content, destination_content, facts: nil, env: ENV) + file_type = template_file_type(recipe) + if destination_content.to_s.strip.empty? + if file_type == :gemfile + return finalize_gemfile_template_source(recipe, template_content, destination_content, facts: facts, template_content: template_content) + end + return merge_appraisals_template_policy(template_content, facts: facts) if file_type == :appraisals + return finalize_github_workflow_template(prune_github_workflow_matrix_by_min_ruby(template_content, facts), facts) if github_workflow_template_recipe?(recipe) + return template_content + end + if destination_content == template_content + if file_type == :gemfile + return finalize_gemfile_template_source(recipe, destination_content, destination_content, facts: facts, template_content: template_content) + end + return merge_appraisals_template_policy(destination_content, facts: facts) if file_type == :appraisals -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • - -
    + return destination_content + end -
    - - - @@ -29790,64 +45654,43 @@

    -

    - - .generated_version_tree_source_url?(source_url, version) ⇒ Boolean +

    - + .merge_dotenv_template_source(template_content, destination_content, recipe) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      -
    • - - - (Boolean) - - - -
    • - -
    - -

    -
    +  case file_type
    +  when :gemspec
    +    return merge_gemspec_template_source(template_content, destination_content, facts: facts, env: env)
    +  when :ruby, :gemfile, :rakefile, :appraisals
    +    merge_result = merge_ruby_template_source(file_type, recipe, template_content, destination_content, facts: facts)
    +  when :yaml
    +    merge_result = Psych::Merge.merge_yaml(
    +      template_content,
    +      destination_content,
    +      "yaml",
    +      **yaml_merge_options(recipe)
    +    )
    +  when :toml
    +    merge_result = Citrus::Toml::Merge.merge_toml(template_content, destination_content, "toml")
    +  when :json, :jsonc
    +    merge_result = merge_json_template_source(template_content, destination_content, recipe, file_type)
    +  when :markdown
    +    return merge_changelog_template_source(template_content, destination_content, facts: facts) if recipe.fetch(:target_path) == "CHANGELOG.md"
     
    +    return template_content
    +  when :dotenv
    +    merge_result = merge_dotenv_template_source(template_content, destination_content, recipe)
    +  when :rbs
    +    merge_result = merge_rbs_template_source(template_content, destination_content, recipe)
    +  when :bash
    +    merge_result = merge_bash_template_source(template_content, destination_content, recipe)
    +  else
    +    return template_content
    +  end
    +  if merge_result[:ok]
    +    output = merge_result.fetch(:output)
    +    if file_type == :gemfile
    +      output = merge_gemfile_eval_bucket_entries(template_content, output, destination_content: destination_content)
    +      return finalize_gemfile_template_source(recipe, output, destination_content, facts: facts, template_content: template_content)
    +    end
    +    return merge_appraisals_template_policy(output, facts: facts) if file_type == :appraisals
     
    -7530
    -7531
    -7532
    -7533
    -7534
    -7535
    -7536
    -
    -
    # File 'lib/kettle/jem.rb', line 7530
    +    output = finalize_github_workflow_template(prune_github_workflow_matrix_by_min_ruby(output, facts), facts) if github_workflow_template_recipe?(recipe)
    +    output = normalize_simplecov_template_source(output) if recipe.fetch(:target_path).to_s == ".simplecov"
    +    return output
    +  end
     
    -def generated_or_obsolete_github_workflow?(relative_path)
    -  return true if preferred_template_source(PACKAGED_TEMPLATE_ROOT, relative_path)
    -  return true if stale_versioned_engine_workflow?(relative_path)
    -  return true if relative_path == ".github/workflows/opencollective.yml"
    +  raise adapter_failure_template_source_error(file_type, recipe) if process_result_adapter_failure?(merge_result)
    +  return template_content if github_workflow_template_recipe?(recipe)
     
    -  OBSOLETE_GITHUB_WORKFLOWS.include?(File.basename(relative_path))
    +  diagnostics = merge_result.fetch(:diagnostics, [])
    +  message = diagnostics.map { |diagnostic| diagnostic[:message] || diagnostic["message"] }.compact.join("; ")
    +  raise ArgumentError, "failed to merge #{file_type} template #{recipe.fetch(:target_path)}: #{message}"
     end
    +
    @@ -29855,58 +45698,77 @@

    -

    - - .git_capture(project_root, *args) ⇒ Object +

    - + .merge_framework_matrix_appraisals(content, facts) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Raises:

    -
      - -
    • - - - (ArgumentError) - - - -
    • -
    - -

     
     
    -8563
    -8564
    -8565
    -8566
    -8567
    -8568
    -8569
    -8570
    -8571
    +7189 +7190 +7191 +7192 +7193 +7194 +7195 +7196 +7197 +7198
    -
    # File 'lib/kettle/jem.rb', line 8563
    -
    -def generated_version_tree_source_url?(source_url, version)
    -  return false unless present_template_token_value?(source_url) && present_template_token_value?(version)
    +      
    # File 'lib/kettle/jem.rb', line 7189
     
    -  uri = URI.parse(source_url.to_s)
    -  segments = uri.path.to_s.split("/").reject(&:empty?)
    -  uri.host == "github.com" && segments[2] == "tree" && segments[3] == "v#{version}"
    -rescue URI::InvalidURIError
    -  false
    +def merge_dotenv_template_source(template_content, destination_content, recipe)
    +  output = Dotenv::Merge::SmartMerger.new(
    +    template_content,
    +    destination_content,
    +    **dotenv_merge_options(recipe)
    +  ).merge
    +  {ok: true, output: output, diagnostics: []}
    +rescue Dotenv::Merge::Error => e
    +  {ok: false, output: destination_content, diagnostics: [{kind: "dotenv_merge_failed", message: e.message}]}
     end
    +
    @@ -29914,9 +45776,9 @@

    -

    - .git_copyright_lines(project_root, machine_users) ⇒ Object + .merge_gemfile_eval_bucket_entries(template_content, merged_content, destination_content: nil) ⇒ Object @@ -29928,53 +45790,97 @@

    @@ -29982,9 +45888,9 @@ @@ -30014,9 +45944,9 @@

    -

    +

    - .git_preflight_report(project_root, template_selection:) ⇒ Object + .merge_gemspec_files_assignment(content, template_content:, destination_content:, template_receiver:, destination_receiver:) ⇒ Object @@ -30028,31 +45958,53 @@

     
     
    -7565
    -7566
    -7567
    -7568
    -7569
    -7570
    -7571
    -7572
    -7573
    -7574
    -7575
    +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742

    @@ -30060,9 +46012,9 @@

    -

    +

    - .git_remote_source_url(project_root) ⇒ Object + .merge_gemspec_files_assignment_source(merged_record:, template_record:, destination_record:) ⇒ Object @@ -30074,19 +46026,97 @@

     
     
    -9122
    -9123
    -9124
    -9125
    -9126
    +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805

    @@ -30094,54 +46124,97 @@

    -

    +

    - .git_success?(project_root, *args) ⇒ Boolean - - + .merge_gemspec_files_assignment_with_destination_splats(merged_parts:, destination_parts:) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -8292
    -8293
    -8294
    -8295
    -8296
    -8297
    +7096 +7097 +7098 +7099 +7100 +7101 +7102 +7103 +7104 +7105 +7106 +7107 +7108 +7109 +7110 +7111 +7112 +7113 +7114 +7115 +7116 +7117 +7118 +7119 +7120 +7121 +7122
    -
    # File 'lib/kettle/jem.rb', line 8292
    +      
    # File 'lib/kettle/jem.rb', line 7096
     
    -def git_capture(project_root, *args)
    -  output = IO.popen(["git", "-C", project_root.to_s, *args], err: File::NULL, &:read)
    -  raise ArgumentError, "git #{args.join(" ")} failed" unless $CHILD_STATUS&.success?
    +def merge_framework_matrix_appraisals(content, facts)
    +  entries = facts.to_h.dig(:ci, :framework_matrix, :appraisals).to_a
    +  return content if entries.empty?
     
    -  output.to_s
    +  generated = entries.to_h do |entry|
    +    [entry.fetch(:name).to_s, framework_matrix_appraisal_block(entry)]
    +  end
    +  replaced = entries.flat_map { |entry| entry.fetch(:replaces, []) }.map(&:to_s).to_set
    +  parsed = appraisal_blocks(content)
    +  emitted = Set.new
    +  blocks = parsed.fetch(:order).map do |name|
    +    next if replaced.include?(name) && !generated.key?(name)
    +
    +    emitted << name
    +    parsed_block = parsed.fetch(:blocks).fetch(name).rstrip
    +    generated_block = generated[name]
    +    generated_block ? merge_appraisal_blocks_with_prism(generated_block, parsed_block) : parsed_block
    +  end.compact
    +  entries.each do |entry|
    +    name = entry.fetch(:name).to_s
    +    next if emitted.include?(name)
    +
    +    blocks << generated.fetch(name)
    +  end
    +
    +  ensure_trailing_newline(([parsed.fetch(:prelude).to_s.rstrip] + blocks).reject(&:empty?).join("\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 8269
    +      
    # File 'lib/kettle/jem.rb', line 6886
     
    -def git_copyright_lines(project_root, machine_users)
    -  files = git_capture(project_root, "ls-files", "-z")
    -  return [] if files.to_s.empty?
    +def merge_gemfile_eval_bucket_entries(template_content, merged_content, destination_content: nil)
    +  template_entries = gemfile_eval_bucket_entries(template_content)
    +  template_by_key = template_entries.to_h { |entry| [entry.fetch(:key), entry] }
    +  destination_entries = gemfile_eval_bucket_entries(destination_content)
    +  destination_only_entries = destination_entries.reject { |entry| template_by_key.key?(entry.fetch(:key)) }
    +  return merged_content if template_entries.empty? && destination_only_entries.empty?
     
    -  author_map = Hash.new { |hash, email| hash[email] = {name: nil, years: [], email: email} }
    -  files.split("\0").reject(&:empty?).each do |relative_path|
    -    next unless File.exist?(File.join(project_root, relative_path))
    +  emitted_paths = Set.new
    +  insert_at = nil
    +  lines = []
    +  merged_lines = merged_content.to_s.lines
    +   = gemfile_eval_bucket_entries(merged_content).to_h { |entry| [entry.fetch(:start_line), entry] }
    +  skip_until = 0
    +  merged_lines.each_with_index do |line, index|
    +    line_number = index + 1
    +    next if line_number < skip_until
     
    -    parse_blame_porcelain(git_capture(project_root, "blame", "--porcelain", "--", relative_path), author_map)
    -  rescue ArgumentError
    -    next
    +    entry = [line_number]
    +    unless entry && template_by_key.key?(entry.fetch(:key))
    +      lines << line
    +      next
    +    end
    +
    +    template_entry = template_by_key.fetch(entry.fetch(:key))
    +    if entry.fetch(:path) == template_entry.fetch(:path)
    +      lines << entry.fetch(:line) unless emitted_paths.include?(entry.fetch(:path))
    +      emitted_paths << entry.fetch(:path)
    +    else
    +      insert_at ||= lines.length
    +    end
    +    skip_until = entry.fetch(:end_line) + 1
       end
    -  resolve_uncommitted_author!(project_root, author_map)
    -  author_map.values
    -    .reject { |entry| copyright_bot_entry?(entry) }
    -    .reject { |entry| copyright_machine_user_entry?(entry, machine_users) }
    -    .reject { |entry| entry[:name].to_s.strip.empty? || entry[:years].empty? }
    -    .sort_by { |entry| [entry[:years].map(&:to_i).min, entry[:name].to_s.downcase] }
    -    .map { |entry| "Copyright (c) #{format_copyright_years(entry[:years])} #{entry[:name]}" }
    -rescue ArgumentError
    -  []
    +
    +  existing_paths = gemfile_eval_bucket_entries(lines.join).map { |entry| entry.fetch(:path) }.to_set
    +  wanted_entries = template_entries + destination_only_entries
    +  missing_lines = wanted_entries
    +    .reject { |entry| emitted_paths.include?(entry.fetch(:path)) || existing_paths.include?(entry.fetch(:path)) }
    +    .map { |entry| entry.fetch(:section_line) }
    +  return ensure_trailing_newline(lines.join) if missing_lines.empty?
    +
    +  insert_at ||= lines.length
    +  lines[insert_at, 0] = missing_lines
    +  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 7589
    +      
    # File 'lib/kettle/jem.rb', line 6444
     
    -def git_output(project_root, *args)
    -  stdout, _stderr, status = Open3.capture3("git", "-C", project_root.to_s, *args)
    -  status.success? ? stdout : ""
    +def merge_gemfile_template_policy(content, facts:, template_content: nil, preserve_self_word_entries: false)
    +  package_name = facts.dig(:package, :name).to_s if facts
    +  removable_gems = ["appraisal"]
    +  removable_gems << package_name unless package_name.to_s.empty?
    +  removable_gems.concat(package_runtime_dependency_names(facts))
    +  removable_gems << "version_gem" unless version_gem_runtime_compatible?(facts)
    +  pruned = remove_gemfile_dependency_blocks(content, removable_gems)
    +  pruned = remove_gemfile_percent_w_entries(pruned, [package_name]) unless preserve_self_word_entries
    +  pruned = merge_template_gemfile_dependency_blocks(
    +    template_content,
    +    pruned,
    +    removable_gems,
    +    preserve_self_word_entries: preserve_self_word_entries
    +  )
    +  apply_commented_gem_dependency_policy(template_content, pruned)
     end
    -
    # File 'lib/kettle/jem.rb', line 7565
    +      
    # File 'lib/kettle/jem.rb', line 7721
     
    -def git_preflight_report(project_root, template_selection:)
    -  inside = git_success?(project_root, "rev-parse", "--is-inside-work-tree")
    -  status = inside ? git_output(project_root, "status", "--porcelain") : nil
    -  dirty_entries = status.to_s.lines.map(&:chomp).reject(&:empty?)
    -  {
    -    git_repository: inside,
    -    clean_worktree: inside && dirty_entries.empty?,
    -    dirty_entries: dirty_entries,
    -    skip_commit: template_selection.fetch(:skip_commit, false)
    -  }
    +def merge_gemspec_files_assignment(content, template_content:, destination_content:, template_receiver:, destination_receiver:)
    +  merged_record = gemspec_assignment_records(content, receiver: template_receiver).find { |record| record.fetch(:field) == "files" }
    +  template_record = gemspec_assignment_records(template_content, receiver: template_receiver).find { |record| record.fetch(:field) == "files" }
    +  destination_record = gemspec_assignment_records(destination_content, receiver: destination_receiver).find { |record| record.fetch(:field) == "files" }
    +  return content unless merged_record && template_record && destination_record
    +
    +  replacement = merge_gemspec_files_assignment_source(
    +    merged_record: merged_record,
    +    template_record: template_record,
    +    destination_record: destination_record
    +  )
    +  replacement ||= replacement_for_supported_gemspec_files_assignment(
    +    template_record: template_record,
    +    destination_record: destination_record,
    +    template_receiver: template_receiver
    +  )
    +  unless replacement
    +    raise Error, "Unsupported gemspec spec.files assignment; kettle-jem requires an AST-mergeable Array, Dir[], or known Bundler git-ls-files assignment"
    +  end
    +
    +  replace_source_range_lines(content, merged_record.fetch(:start_line), merged_record.fetch(:end_line), replacement)
     end
    -
    # File 'lib/kettle/jem.rb', line 9122
    +      
    # File 'lib/kettle/jem.rb', line 7762
     
    -def git_remote_source_url(project_root)
    -  normalize_git_source_url(git_capture(project_root, "config", "--get", "remote.origin.url").strip)
    -rescue ArgumentError
    -  nil
    +def merge_gemspec_files_assignment_source(merged_record:, template_record:, destination_record:)
    +  merged_parts = gemspec_files_collection_parts(merged_record)
    +  template_parts = gemspec_files_collection_parts(template_record)
    +  destination_parts = gemspec_files_collection_parts(destination_record)
    +  return unless merged_parts && template_parts && destination_parts
    +
    +  if gemspec_files_collection_has_nonliteral_entries?(destination_parts)
    +    return merge_gemspec_files_assignment_with_destination_splats(
    +      merged_parts: merged_parts,
    +      destination_parts: destination_parts
    +    )
    +  end
    +
    +  combined_groups = []
    +  seen = {}
    +  destination_groups = destination_parts.fetch(:groups).reject do |group|
    +    stale_generated_gemspec_files_group?(group) ||
    +      (group, template_parts)
    +  end
    +  merged_groups = merged_parts.fetch(:groups).reject do |group|
    +    (group, merged_parts)
    +  end
    +
    +  [
    +    [destination_parts, destination_groups],
    +    [merged_parts, merged_groups],
    +    [template_parts, template_parts.fetch(:groups)]
    +  ].each do |parts, groups|
    +    groups.each do |group|
    +      next if seen[group.fetch(:key)]
    +
    +      combined_groups << group.merge(source_collection_kind: gemspec_files_group_collection_kind(group, parts))
    +      seen[group.fetch(:key)] = true
    +    end
    +  end
    +  if gemspec_files_collection_needs_concat?(merged_parts, combined_groups)
    +    return gemspec_files_concat_collection_source(merged_parts, combined_groups)
    +  end
    +
    +  body = combined_groups.each_with_index.map do |group, index|
    +    gemspec_files_collection_group_source(group, trailing_comma: index < combined_groups.length - 1)
    +  end.join
    +  merged_parts.fetch(:opening) + body + merged_parts.fetch(:closing)
     end
    +
    @@ -30149,9 +46222,9 @@

    -

    +

    - .git_worktree_prefix(project_root) ⇒ Object + .merge_gemspec_template_source(template_content, destination_content, facts: nil, env: ENV) ⇒ Object @@ -30163,19 +46236,109 @@

     
     
    -9094
    -9095
    -9096
    -9097
    -9098
    +7336 +7337 +7338 +7339 +7340 +7341 +7342 +7343 +7344 +7345 +7346 +7347 +7348 +7349 +7350 +7351 +7352 +7353 +7354 +7355 +7356 +7357 +7358 +7359 +7360 +7361 +7362 +7363 +7364 +7365 +7366 +7367 +7368 +7369 +7370 +7371 +7372 +7373 +7374 +7375 +7376 +7377 +7378 +7379 +7380 +7381 +7382 +7383 +7384 +7385

    @@ -30183,9 +46346,9 @@

    -

    +

    - .git_worktree_root(project_root) ⇒ Object + .merge_json_template_source(template_content, destination_content, recipe, file_type) ⇒ Object @@ -30197,21 +46360,29 @@

     
     
    -9087
    -9088
    -9089
    -9090
    -9091
    -9092
    +7165 +7166 +7167 +7168 +7169 +7170 +7171 +7172 +7173 +7174

    @@ -30219,9 +46390,9 @@

    -

    +

    - .github_actions_coverage_config(config, env = ENV) ⇒ Object + .merge_local_gem_overrides(content, destination_content, facts:, template_content: nil) ⇒ Object @@ -30233,39 +46404,33 @@

     
     
    -10809
    -10810
    -10811
    -10812
    -10813
    -10814
    -10815
    -10816
    -10817
    -10818
    -10819
    -10820
    -10821
    -10822
    -10823
    +6140 +6141 +6142 +6143 +6144 +6145 +6146 +6147 +6148 +6149 +6150 +6151

    @@ -30273,56 +46438,43 @@

    -

    - - .github_actions_coverage_enabled?(content) ⇒ Boolean +

    - + .merge_prism_gemfile_template_source(template_content, destination_content) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -7584
    -7585
    -7586
    -7587
    +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914
    -
    # File 'lib/kettle/jem.rb', line 7584
    +      
    # File 'lib/kettle/jem.rb', line 7878
     
    -def git_success?(project_root, *args)
    -  _stdout, _stderr, status = Open3.capture3("git", "-C", project_root.to_s, *args)
    -  status.success?
    +def merge_gemspec_files_assignment_with_destination_splats(merged_parts:, destination_parts:)
    +  return unless %i[array concat].include?(destination_parts.fetch(:collection_kind))
    +
    +  merged_keys = merged_parts.fetch(:groups).map { |group| group.fetch(:key) }.to_set
    +  destination_groups = destination_parts.fetch(:groups).reject do |group|
    +    stale_generated_gemspec_files_group?(group) ||
    +      (group, merged_parts)
    +  end
    +  destination_only_nonliteral = destination_groups.any? do |group|
    +    !group.fetch(:node).is_a?(::Prism::StringNode) && !merged_keys.include?(group.fetch(:key))
    +  end
    +  return if destination_only_nonliteral
    +
    +  destination_groups_by_key = destination_groups.to_h do |group|
    +    [group.fetch(:key), group.merge(source_collection_kind: gemspec_files_group_collection_kind(group, destination_parts))]
    +  end
    +  seen = Set.new
    +  merged_groups = merged_parts.fetch(:groups).reject do |group|
    +    (group, merged_parts)
    +  end
    +  groups = merged_groups.map do |group|
    +    key = group.fetch(:key)
    +    seen << key
    +    destination_groups_by_key.fetch(key, group.merge(source_collection_kind: gemspec_files_group_collection_kind(group, merged_parts)))
    +  end
    +  destination_groups.each do |group|
    +    next if seen.include?(group.fetch(:key))
    +
    +    groups << group.merge(source_collection_kind: gemspec_files_group_collection_kind(group, destination_parts))
    +  end
    +
    +  if gemspec_files_collection_needs_concat?(merged_parts, groups)
    +    return gemspec_files_concat_collection_source(merged_parts, groups)
    +  end
    +
    +  gemspec_files_array_collection_source(merged_parts, groups)
     end
    -
    # File 'lib/kettle/jem.rb', line 9094
    +      
    # File 'lib/kettle/jem.rb', line 7336
     
    -def git_worktree_prefix(project_root)
    -  git_capture(project_root, "rev-parse", "--show-prefix").strip
    -rescue ArgumentError
    -  ""
    +def merge_gemspec_template_source(template_content, destination_content, facts: nil, env: ENV)
    +  template_receiver = gemspec_block_param(template_content) || "spec"
    +  destination_receiver = gemspec_block_param(destination_content) || "spec"
    +  package_name = facts.dig(:package, :name).to_s if facts
    +  replacements = gemspec_preserved_assignments(destination_content, receiver: destination_receiver)
    +    .except(*env_overridden_gemspec_fields(env))
    +  replacements = remove_stale_generated_gemspec_homepage_replacement(
    +    replacements,
    +    destination_content,
    +    facts,
    +    receiver: destination_receiver
    +  )
    +  normalized_replacements = replacements.to_h do |field, source|
    +    replacement = normalize_gemspec_receiver(source.rstrip, from: destination_receiver, to: template_receiver)
    +    [field, normalize_gemspec_project_emoji(replacement, facts, field: field)]
    +  end
    +  merged = replace_gemspec_assignment_sources(template_content, normalized_replacements, receiver: template_receiver)
    +  merged = insert_missing_gemspec_assignment_sources(merged, normalized_replacements, receiver: template_receiver)
    +  merged = merge_gemspec_files_assignment(
    +    merged,
    +    template_content: template_content,
    +    destination_content: destination_content,
    +    template_receiver: template_receiver,
    +    destination_receiver: destination_receiver
    +  )
    +  merged = insert_missing_gemspec_files_assignment(
    +    merged,
    +    template_content: template_content,
    +    template_receiver: template_receiver
    +  )
    +  merged = remove_gemspec_assignment(merged, receiver: template_receiver, field: "extra_rdoc_files")
    +  merged = preserve_gemspec_dependency_lines(
    +    merged,
    +    destination_content,
    +    template_receiver: template_receiver,
    +    destination_receiver: destination_receiver,
    +    facts: facts
    +  )
    +  merged = preserve_gemspec_freeze_blocks(merged, destination_content, facts: facts, receiver: template_receiver)
    +  merged = apply_configured_gemspec_licenses(merged, facts, receiver: template_receiver)
    +  merged = apply_configured_gemspec_required_ruby_version(merged, facts, receiver: template_receiver)
    +  merged = remove_duplicate_gemspec_assignments(merged, receiver: template_receiver, fields: %w[homepage])
    +  merged = remove_gemspec_self_dependency_lines(merged, package_name, receiver: template_receiver)
    +  merged = remove_gemspec_version_gem_dependency_when_runtime_incompatible(merged, facts, receiver: template_receiver)
    +  merged = remove_gemspec_version_gem_dependency_when_non_default_entrypoint(merged, facts, receiver: template_receiver)
    +  merged = remove_gemspec_development_dependencies_already_runtime(merged, receiver: template_receiver)
    +  merged = remove_empty_gemspec_development_dependency_section_headings(merged, receiver: template_receiver)
    +  merged = sort_runtime_gemspec_dependency_lines(merged, receiver: template_receiver)
    +  rewrite_gemspec_version_loader(merged, facts: facts)
     end
    -
    # File 'lib/kettle/jem.rb', line 9087
    +      
    # File 'lib/kettle/jem.rb', line 7165
     
    -def git_worktree_root(project_root)
    -  root = git_capture(project_root, "rev-parse", "--show-toplevel").strip
    -  root.empty? ? project_root.to_s : root
    -rescue ArgumentError
    -  project_root.to_s
    +def merge_json_template_source(template_content, destination_content, recipe, file_type)
    +  output = Json::Merge::SmartMerger.new(
    +    template_content,
    +    destination_content,
    +    **json_merge_options(recipe)
    +  ).merge
    +  {ok: true, output: output, diagnostics: []}
    +rescue Json::Merge::Error => e
    +  {ok: false, output: destination_content, diagnostics: [{kind: "#{file_type}_merge_failed", message: e.message}]}
     end
    -
    # File 'lib/kettle/jem.rb', line 10809
    -
    -def github_actions_coverage_config(config, env = ENV)
    -  workflows = config["workflows"]
    -  return {} unless workflows.is_a?(Hash)
    +      
    # File 'lib/kettle/jem.rb', line 6140
     
    -  raw = workflows["coverage"]
    -  enabled = raw == true || (raw.is_a?(Hash) && raw.fetch("enabled", false) == true)
    -  return {} unless enabled
    +def merge_local_gem_overrides(content, destination_content, facts:, template_content: nil)
    +  template_gems = local_gems_assignment(content)
    +  template_gems = local_gems_assignment(template_content) if template_gems.empty?
    +  destination_gems = local_gems_assignment(destination_content)
    +  return content if template_gems.empty? && destination_gems.empty?
     
    -  raw = {} unless raw.is_a?(Hash)
    -  {
    -    enabled: true,
    -    command: raw.fetch("command", github_actions_exec_cmd(config, env)).to_s,
    -    appraisal: raw.fetch("appraisal", "coverage").to_s
    -  }
    +  destination_gems = destination_gems.reject do |destination_gem|
    +    template_gems.any? { |template_gem| versioned_gem_name_update_candidate?(destination_gem, template_gem) }
    +  end
    +  gems = (template_gems + destination_gems).map(&:to_s).reject(&:empty?).uniq
    +  replace_local_gems_assignment(content, gems)
     end
    +
    @@ -30330,9 +46482,9 @@

    -

    +

    - .github_actions_coverage_stepsObject + .merge_rbs_signature_sources(template_content, destination_content) ⇒ Object @@ -30344,20 +46496,6 @@

     
     
    -11408
    -11409
    -11410
    -11411
    -11412
    -11413
    -11414
    -11415
    -11416
    -11417
    -11418
    -11419
    -11420
    -11421
     11422
     11423
     11424
    @@ -30367,106 +46505,74 @@ 

    11428 11429 11430 -11431 -11432 -11433 -11434 -11435 -11436 -11437 -11438 -11439 -11440 -11441 -11442 -11443 -11444 -11445 -11446 -11447 -11448 -11449 -11450 -11451 -11452 -11453 -11454 -11455 -11456 -11457 -11458 -11459 -11460 -11461 -11462

    +11431 + +

    + +
     
     
    -11369
    -11370
    -11371
    -11372
    -11373
    +6412 +6413 +6414 +6415 +6416 +6417 +6418 +6419 +6420 +6421
    -
    # File 'lib/kettle/jem.rb', line 11369
    +      
    # File 'lib/kettle/jem.rb', line 6412
     
    -def github_actions_coverage_enabled?(content)
    -  yaml_contains_key_value?(YAML.safe_load(content.to_s, aliases: true), "K_SOUP_COV_DO", "true")
    -rescue Psych::Exception
    -  false
    +def merge_prism_gemfile_template_source(template_content, destination_content)
    +  Prism::Merge.merge_ruby(
    +    template_content,
    +    destination_content,
    +    "ruby",
    +    preference: :template,
    +    add_template_only_nodes: true,
    +    signature_generator: Prism::Merge.ruby_dsl_signature_generator
    +  )
     end
    +
    # File 'lib/kettle/jem.rb', line 11422
    +
    +def merge_rbs_signature_sources(template_content, destination_content)
    +  return ensure_trailing_newline(template_content) if destination_content.to_s.strip.empty?
    +
    +  result = merge_rbs_template_source(
    +    ensure_trailing_newline(template_content),
    +    ensure_trailing_newline(destination_content),
    +    {template_preference: {preference: "destination"}}
    +  )
    +  result.fetch(:ok) ? result.fetch(:output) : ensure_trailing_newline(destination_content)
    +end
    +
    +
    + +
    +

    + + .merge_rbs_template_source(template_content, destination_content, recipe) ⇒ Object + + + + + +

    + +
    +
    +
    +
    +7213
    +7214
    +7215
    +7216
    +7217
    +7218
    +7219
    +7220
    +7221
    +7222
    -
    # File 'lib/kettle/jem.rb', line 11408
    +      
    # File 'lib/kettle/jem.rb', line 7213
     
    -def github_actions_coverage_steps
    -  <<~YAML.lines.map { |line| line.strip.empty? ? line : "      #{line}" }.join.chomp
    -    - name: Upload coverage to Coveralls
    -      if: ${{ !env.ACT }}
    -      uses: coverallsapp/github-action@5cbfd81b66ca5d10c19b062c04de0199c215fb6e # v2.3.7
    -      with:
    -        github-token: ${{ secrets.GITHUB_TOKEN }}
    -        file: coverage/lcov.info
    -        format: lcov
    -      continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
    -
    -    - name: Upload coverage to QLTY
    -      if: ${{ !env.ACT }}
    -      uses: qltysh/qlty-action/coverage@fd52dc852530a708d68c3b7342f8d33d1df4cd55 # v2.2.1
    -      with:
    -        oidc: true
    -        files: coverage/lcov.info
    -        format: lcov
    -        skip-errors: false
    -      continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
    -
    -    - name: Upload coverage to CodeCov
    -      if: ${{ !env.ACT }}
    -      uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7
    -      with:
    -        use_oidc: true
    -        disable_search: true
    -        fail_ci_if_error: false
    -        files: coverage/lcov.info,coverage/coverage.xml
    -        verbose: true
    -
    -    - name: Code Coverage Summary Report
    -      if: ${{ !env.ACT && github.event_name == 'pull_request' }}
    -      uses: irongut/CodeCoverageSummary@51cc3a756ddcd398d447c044c02cb6aa83fdae95 # v1.3.0
    -      with:
    -        filename: ./coverage/coverage.xml
    -        badge: true
    -        fail_below_min: true
    -        format: markdown
    -        hide_branch_rate: false
    -        hide_complexity: true
    -        indicators: true
    -        output: both
    -        thresholds: '${{ env.K_SOUP_COV_MIN_LINE }} ${{ env.K_SOUP_COV_MIN_BRANCH }}'
    -      continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
    -
    -    - name: Add Coverage PR Comment
    -      uses: marocchino/sticky-pull-request-comment@0ea0beb66eb9baf113663a64ec522f60e49231c0 # v3.0.4
    -      if: ${{ !env.ACT && github.event_name == 'pull_request' }}
    -      with:
    -        recreate: true
    -        path: code-coverage-results.md
    -      continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
    -  YAML
    -end
    +def merge_rbs_template_source(template_content, destination_content, recipe) + output = Rbs::Merge::SmartMerger.new( + template_content, + destination_content, + **rbs_merge_options(recipe) + ).merge + {ok: true, output: output, diagnostics: []} +rescue Rbs::Merge::Error => e + {ok: false, output: destination_content, diagnostics: [{kind: "rbs_merge_failed", message: e.message}]} +end
    -

    +

    - .github_actions_custom_workflows(project_root, config = {}, opencollective_disabled: false) ⇒ Object + .merge_readme_template(template_content:, destination_content:, preserve_config: {}) ⇒ Object @@ -30478,37 +46584,25 @@

     
     
    -7479
    -7480
    -7481
    -7482
    -7483
    -7484
    -7485
    -7486
    -7487
    -7488
    -7489
    -7490
    -7491
    -7492
    +12912 +12913 +12914 +12915 +12916 +12917 +12918 +12919 -
    # File 'lib/kettle/jem.rb', line 7479
    -
    -def github_actions_custom_workflows(project_root, config = {}, opencollective_disabled: false)
    -  workflow_root = File.join(project_root, ".github", "workflows")
    -  return [] unless Dir.exist?(workflow_root)
    +      
    # File 'lib/kettle/jem.rb', line 12912
     
    -  Dir.glob(File.join(workflow_root, "*.{yml,yaml}")).filter_map do |path|
    -    relative_path = path.delete_prefix("#{project_root}/")
    -    next if opencollective_disabled && opencollective_disabled_file?(relative_path)
    -    next if inactive_packaged_workflow?(relative_path, config)
    -    next if generated_or_obsolete_github_workflow?(relative_path) &&
    -      !skip_packaged_workflow_template?(relative_path, config)
    +def merge_readme_template(template_content:, destination_content:, preserve_config: {})
    +  return template_content if destination_content.to_s.strip.empty?
     
    -    relative_path
    -  end.sort
    +  with_front_sections = preserve_readme_front_sections(template_content, destination_content)
    +  preserved = preserve_readme_sections(with_front_sections, destination_content, preserve_config)
    +  with_h1 = preserve_readme_h1(preserved, destination_content, preserve_config)
    +  preserve_readme_managed_block(with_h1, destination_content, "kettle-jem:metadata")
     end
    @@ -30516,9 +46610,9 @@

    -

    +

    - .github_actions_exec_cmd(config, env) ⇒ Object + .merge_ruby_template_source(file_type, recipe, template_content, destination_content, facts: nil) ⇒ Object @@ -30530,24 +46624,34 @@

     
     
    -10825
    -10826
    -10827
    -10828
    -10829
    -10830
    -10831
    -10832
    +6398 +6399 +6400 +6401 +6402 +6403 +6404 +6405 +6406 +6407 +6408 +6409 +6410 -
    # File 'lib/kettle/jem.rb', line 10825
    +      
    # File 'lib/kettle/jem.rb', line 6398
     
    -def github_actions_exec_cmd(config, env)
    -  workflows = config["workflows"]
    -  workflows = {} unless workflows.is_a?(Hash)
    +def merge_ruby_template_source(file_type, recipe, template_content, destination_content, facts: nil)
    +  return merge_prism_gemfile_template_source(template_content, destination_content) if file_type == :gemfile
     
    -  normalize_github_actions_exec_cmd(
    -    preferred_template_token_value("kettle-test", workflows["exec_cmd"], env, "KJ_EXEC_CMD").to_s
    +  Prism::Merge.merge_ruby(
    +    template_content,
    +    destination_content,
    +    "ruby",
    +    preference: :destination,
    +    add_template_only_nodes: true,
    +    signature_generator: Prism::Merge.ruby_dsl_signature_generator(require_aliases: ruby_require_aliases(recipe, facts)),
    +    **prism_ruby_merge_options(recipe)
       )
     end
    @@ -30556,9 +46660,9 @@

    -

    +

    - .github_actions_framework_matrix(config) ⇒ Object + .merge_template_gemfile_dependency_blocks(template_content, content, removable_gems, preserve_self_word_entries: false) ⇒ Object @@ -30570,121 +46674,39 @@

     
     
    -10673
    -10674
    -10675
    -10676
    -10677
    -10678
    -10679
    -10680
    -10681
    -10682
    -10683
    -10684
    -10685
    -10686
    -10687
    -10688
    -10689
    -10690
    -10691
    -10692
    -10693
    -10694
    -10695
    -10696
    -10697
    -10698
    -10699
    -10700
    -10701
    -10702
    -10703
    -10704
    -10705
    -10706
    -10707
    -10708
    -10709
    -10710
    -10711
    -10712
    -10713
    -10714
    -10715
    -10716
    -10717
    -10718
    -10719
    -10720
    -10721
    -10722
    -10723
    -10724
    -10725
    -10726
    -10727
    -10728
    +6494 +6495 +6496 +6497 +6498 +6499 +6500 +6501 +6502 +6503 +6504 +6505 +6506 +6507 +6508 -
    # File 'lib/kettle/jem.rb', line 10673
    -
    -def github_actions_framework_matrix(config)
    -  workflows = config["workflows"]
    -  return {} unless workflows.is_a?(Hash) && workflows["preset"].to_s.strip.downcase == "framework"
    -
    -  raw = workflows["framework_matrix"]
    -  return {} unless raw.is_a?(Hash)
    -
    -  dimension = raw["dimension"].to_s.strip
    -  versions = raw["versions"]
    -  pattern = raw["gemfile_pattern"].to_s.strip
    -  return {} unless !dimension.empty? && versions.is_a?(Array) && !versions.empty? && !pattern.empty?
    +      
    # File 'lib/kettle/jem.rb', line 6494
     
    -  framework_gem = raw.fetch("gem", dimension).to_s.strip
    -  return {} if framework_gem.empty?
    +def merge_template_gemfile_dependency_blocks(template_content, content, removable_gems, preserve_self_word_entries: false)
    +  template = remove_gemfile_dependency_blocks(template_content, removable_gems)
    +  template = remove_gemfile_percent_w_entries(template, removable_gems) unless preserve_self_word_entries
    +  existing = gemfile_dependency_names(content) + gemfile_percent_w_names(content)
    +  additions = gemfile_paragraphs(template).filter_map do |paragraph|
    +    names = gemfile_dependency_names(paragraph) + gemfile_percent_w_names(paragraph)
    +    next if names.empty?
    +    next if (names - existing).empty?
     
    -  version_entries = versions.filter_map { |version| framework_matrix_version_entry(version) }
    -  return {} if version_entries.empty?
    +    paragraph
    +  end
    +  return content if additions.empty?
     
    -  appraisal_gemfiles = framework_matrix_appraisal_gemfiles(raw)
    -  gemfiles = version_entries.map do |entry|
    -    gemfile = expand_framework_gemfile_pattern(pattern, entry.fetch(:slug))
    -    {
    -      path: framework_gemfile_path(gemfile),
    -      gem: framework_gem,
    -      requirement: entry.fetch(:requirement),
    -      env: entry.fetch(:env, {})
    -    }
    -  end.uniq { |entry| entry.fetch(:path) }
    -  gemfiles.reject! { |entry| template_keep_destination_path?(config, entry.fetch(:path)) }
    -  {
    -    dimension: dimension,
    -    gem: framework_gem,
    -    workflow: framework_matrix_workflow_enabled?(raw),
    -    versions: version_entries.map { |entry| entry.fetch(:label) },
    -    gemfile_pattern: pattern,
    -    include: version_entries.map do |entry|
    -      {
    -        framework_version: entry.fetch(:label),
    -        appraisal: entry[:appraisal_name] || framework_matrix_appraisal_name(dimension, entry.fetch(:slug))
    -      }
    -    end,
    -    gemfiles: gemfiles,
    -    appraisals: version_entries.map do |entry|
    -      gemfile = framework_gemfile_path(expand_framework_gemfile_pattern(pattern, entry.fetch(:slug)))
    -      name = entry[:appraisal_name] || framework_matrix_appraisal_name(dimension, entry.fetch(:slug))
    -      {
    -        name: name,
    -        framework_version: entry.fetch(:label),
    -        gem: framework_gem,
    -        env: entry.fetch(:env, {}),
    -        eval_gemfiles: [framework_matrix_appraisal_gemfile_path(gemfile), *appraisal_gemfiles].uniq,
    -        replaces: framework_matrix_replaced_appraisal_names(dimension, entry, name)
    -      }
    -    end
    -  }
    +  insert_gemfile_dependency_blocks(content, additions)
     end
    @@ -30692,9 +46714,9 @@

    -

    +

    - .github_actions_obsolete_workflows(project_root) ⇒ Object + .metadata_value(metadata, key) ⇒ Object @@ -30706,25 +46728,23 @@

     
     
    -7513
    -7514
    -7515
    -7516
    -7517
    -7518
    -7519
    -7520
    +11216 +11217 +11218 +11219 +11220 +11221 +11222 -
    # File 'lib/kettle/jem.rb', line 7513
    +      
    # File 'lib/kettle/jem.rb', line 11216
     
    -def github_actions_obsolete_workflows(project_root)
    -  workflow_root = File.join(project_root, ".github", "workflows")
    -  OBSOLETE_GITHUB_WORKFLOWS.filter_map do |workflow|
    -    relative_path = ".github/workflows/#{workflow}"
    -    path = File.join(workflow_root, workflow)
    -    relative_path if File.exist?(path)
    -  end.sort
    +def (, key)
    +  value = [key]
    +  return if value.nil?
    +
    +  text = value.to_s.strip
    +  text unless text.empty?
     end
    @@ -30732,9 +46752,9 @@

    -

    +

    - .github_actions_ruby_versions(min_ruby) ⇒ Object + .migrate_readme_logo_config(content) ⇒ Object @@ -30746,21 +46766,79 @@

     
     
    -7472
    -7473
    -7474
    -7475
    -7476
    -7477
    +8880 +8881 +8882 +8883 +8884 +8885 +8886 +8887 +8888 +8889 +8890 +8891 +8892 +8893 +8894 +8895 +8896 +8897 +8898 +8899 +8900 +8901 +8902 +8903 +8904 +8905 +8906 +8907 +8908 +8909 +8910 +8911 +8912 +8913 +8914 -
    # File 'lib/kettle/jem.rb', line 7472
    +      
    # File 'lib/kettle/jem.rb', line 8880
     
    -def github_actions_ruby_versions(min_ruby)
    -  floor = min_ruby.to_s[/\d+\.\d+/] || "3.1"
    -  candidates = %w[3.1 3.2 3.3 3.4]
    -  selected = candidates.select { |version| Gem::Version.new(version) >= Gem::Version.new(floor) }
    -  selected.empty? ? [floor] : selected
    +def migrate_readme_logo_config(content)
    +  config = YAML.safe_load(content.to_s, permitted_classes: [], aliases: true) || {}
    +  readme_config = config["readme"]
    +  return content unless readme_config.is_a?(Hash)
    +
    +  configured_specs = normalized_readme_logo_specs(readme_config["top_logos"] || readme_config["top_logo_options"])
    +  legacy_mode_migrated = configured_specs.empty?
    +  if legacy_mode_migrated
    +    legacy_options = legacy_readme_top_logo_mode_options(readme_config["top_logo_mode"])
    +    configured_specs = legacy_options.map { |option| {type: option, width: nil} }
    +  end
    +  configured = configured_specs.map { |spec| spec.fetch(:type) }
    +  return content if configured.empty?
    +
    +  top_logo_specs = configured_specs.select { |spec| README_TOP_LOGO_DEFAULTS.include?(spec.fetch(:type)) }
    +  h2_synopsis_logo_specs = normalized_readme_logo_specs(readme_config["h2_synopsis_logos"])
    +  h2_synopsis_logo_specs = configured_specs.select { |spec| README_H2_SYNOPSIS_LOGO_DEFAULTS.include?(spec.fetch(:type)) } if h2_synopsis_logo_specs.empty?
    +  if legacy_mode_migrated && h2_synopsis_logo_specs.empty?
    +    h2_synopsis_logo_specs = README_H2_SYNOPSIS_LOGO_DEFAULTS.map { |option| {type: option, width: nil} }
    +  end
    +  top_logos = top_logo_specs.map { |spec| readme_logo_config_value(spec) }
    +  h2_synopsis_logos = h2_synopsis_logo_specs.map { |spec| readme_logo_config_value(spec) }
    +  return content if h2_synopsis_logos.empty? && top_logos == configured
    +
    +  migrated = if readme_config.key?("top_logos")
    +    replace_yaml_scalar_path(content, %w[readme top_logos], top_logos.join(","))
    +  else
    +    insert_yaml_scalar_after_path(content, %w[readme], "top_logos", top_logos.join(","))
    +  end
    +  return replace_yaml_scalar_path(migrated, %w[readme h2_synopsis_logos], h2_synopsis_logos.join(",")) if readme_config.key?("h2_synopsis_logos")
    +
    +  insert_yaml_scalar_after_path(migrated, %w[readme top_logos], "h2_synopsis_logos", h2_synopsis_logos.join(","))
    +rescue Psych::Exception
    +  content
     end
    @@ -30768,9 +46846,9 @@

    -

    +

    - .github_actions_standard_appraisal_gemfiles(config) ⇒ Object + .min_ruby_version(requirement) ⇒ Object @@ -30782,41 +46860,25 @@

    -10848 -10849 -10850 -10851 -10852 -10853 -10854 -10855 -10856 -10857 -10858 -10859 -10860 -10861 -10862 -10863 +12347 +12348 +12349 +12350 +12351 +12352 +12353 +12354 -
    # File 'lib/kettle/jem.rb', line 10848
    +      
    # File 'lib/kettle/jem.rb', line 12347
     
    -def github_actions_standard_appraisal_gemfiles(config)
    -  workflows = config["workflows"]
    -  workflows = {} unless workflows.is_a?(Hash)
    -  appraisal_matrix = config["appraisal_matrix"]
    -  appraisal_matrix = {} unless appraisal_matrix.is_a?(Hash)
    -
    -  raw_paths =
    -    workflows["standard_appraisal_gemfiles"] ||
    -    appraisal_matrix["appraisal_gemfiles"] ||
    -    appraisal_matrix["appraisal_eval_gemfiles"]
    +def min_ruby_version(requirement)
    +  token = minimum_ruby_token(requirement)
    +  return if token.empty?
     
    -  Array(raw_paths).filter_map do |path|
    -    normalized = path.to_s.strip.sub(%r{\Agemfiles/}, "")
    -    normalized unless normalized.empty?
    -  end.uniq
    +  Gem::Version.new(token)
    +rescue ArgumentError
    +  nil
     end
    @@ -30824,9 +46886,9 @@

    -

    +

    - .github_actions_step_pinsObject + .minimum_ruby_token(requirement) ⇒ Object @@ -30838,51 +46900,21 @@

     
     
    -11562
    -11563
    -11564
    -11565
    -11566
    -11567
    -11568
    -11569
    -11570
    -11571
    -11572
    -11573
    -11574
    -11575
    -11576
    -11577
    -11578
    -11579
    -11580
    -11581
    -11582
    +10573 +10574 +10575 +10576 +10577 +10578

    -
    # File 'lib/kettle/jem.rb', line 11562
    +      
    # File 'lib/kettle/jem.rb', line 10573
     
    -def github_actions_step_pins
    -  {
    -    "actions/checkout" => "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3",
    -    "ruby/setup-ruby" => "ruby/setup-ruby@89f90524b88a01fe6e0b732220432cc6142926af # v1.313.0",
    -    "coverallsapp/github-action" => "coverallsapp/github-action@5cbfd81b66ca5d10c19b062c04de0199c215fb6e # v2.3.7",
    -    "qltysh/qlty-action/coverage" => "qltysh/qlty-action/coverage@fd52dc852530a708d68c3b7342f8d33d1df4cd55 # v2.2.1",
    -    "codecov/codecov-action" => "codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7",
    -    "irongut/CodeCoverageSummary" => "irongut/CodeCoverageSummary@51cc3a756ddcd398d447c044c02cb6aa83fdae95 # v1.3.0",
    -    "marocchino/sticky-pull-request-comment" => "marocchino/sticky-pull-request-comment@0ea0beb66eb9baf113663a64ec522f60e49231c0 # v3.0.4",
    -    "actions/upload-artifact" => "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1",
    -    "amancevice/setup-code-climate" => "amancevice/setup-code-climate@0daf2985a225e8ac15975b4d233010e94d65b76a # v2",
    -    "actions/dependency-review-action" => "actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0",
    -    "github/codeql-action/init" => "github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2",
    -    "github/codeql-action/autobuild" => "github/codeql-action/autobuild@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2",
    -    "github/codeql-action/analyze" => "github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2",
    -    "pozil/auto-assign-issue" => "pozil/auto-assign-issue@af6beea6bdf1e8eb373f061c5bc168681fc6d011 # v4.0.1",
    -    "apache/skywalking-eyes/dependency" => "apache/skywalking-eyes/dependency@61275cc80d0798a405cb070f7d3a8aaf7cf2c2c1 # v0.8.0",
    -    "kettle-rb/ts-grammar-action" => "kettle-rb/ts-grammar-action@4b0c04d11ed5b85c67c0c60c6ecb590e81748ccb # v1.0.1",
    -    "sarisia/actions-status-discord" => "sarisia/actions-status-discord@eb045afee445dc055c18d3d90bd0f244fd062708 # v1.16.0"
    -  }
    +def minimum_ruby_token(requirement)
    +  text = requirement.to_s.strip
    +  return "0" if text == "0"
    +
    +  requirement.to_s[/\d+(?:\.\d+){1,2}/].to_s
     end
    @@ -30890,9 +46922,9 @@

    -

    +

    - .github_funding_platform_urls(platform, values) ⇒ Object + .mit_readme_license_introObject @@ -30904,71 +46936,17 @@

     
     
    -7440
    -7441
    -7442
    -7443
    -7444
    -7445
    -7446
    -7447
    -7448
    -7449
    -7450
    -7451
    -7452
    -7453
    -7454
    -7455
    -7456
    -7457
    -7458
    -7459
    -7460
    -7461
    -7462
    -7463
    -7464
    -7465
    -7466
    -7467
    -7468
    -7469
    -7470
    +12468 +12469 +12470 +12471 -
    # File 'lib/kettle/jem.rb', line 7440
    -
    -def github_funding_platform_urls(platform, values)
    -  values.filter_map do |value|
    -    handle = value.to_s.strip.delete_prefix("@")
    -    next if handle.empty?
    +      
    # File 'lib/kettle/jem.rb', line 12468
     
    -    case platform
    -    when "buy_me_a_coffee"
    -      "https://www.buymeacoffee.com/#{handle}"
    -    when "custom"
    -      handle if http_url?(handle)
    -    when "github"
    -      "https://github.com/sponsors/#{handle}"
    -    when "issuehunt"
    -      "https://issuehunt.io/u/#{handle}"
    -    when "ko_fi"
    -      "https://ko-fi.com/#{handle}"
    -    when "liberapay"
    -      "https://liberapay.com/#{handle}/donate"
    -    when "open_collective"
    -      "https://opencollective.com/#{handle}"
    -    when "patreon"
    -      "https://patreon.com/#{handle}"
    -    when "polar"
    -      "https://polar.sh/#{handle}"
    -    when "thanks_dev"
    -      "https://thanks.dev/#{handle}"
    -    when "tidelift"
    -      "https://tidelift.com/funding/github/#{handle}"
    -    end
    -  end
    +def mit_readme_license_intro
    +  "The gem is available as open source under the terms of\n" \
    +    "the #{license_link("MIT")} #{license_badge("MIT")}."
     end
    @@ -30976,9 +46954,9 @@

    -

    +

    - .github_funding_urls(path, opencollective_disabled: false) ⇒ Object + .monorepo_root_file_strategy(entry) ⇒ Object @@ -30990,29 +46968,75 @@

     
     
    -7429
    -7430
    -7431
    -7432
    -7433
    -7434
    -7435
    -7436
    -7437
    -7438
    +9255 +9256 +9257 +9258 +9259 +9260 +9261 + + +
    # File 'lib/kettle/jem.rb', line 9255
    +
    +def monorepo_root_file_strategy(entry)
    +  if entry.to_s == "CHANGELOG.md"
    +    "keep_destination"
    +  else
    +    "accept_template"
    +  end
    +end
    + + +

    + +
    +

    + + .monorepo_root_gemfile_dependency_linesObject + + + + + +

    + + @@ -31020,9 +47044,9 @@

    -

    +

    - .github_org_from_url(url) ⇒ Object + .monorepo_root_gemfile_dependency_sync_step(project_root, report) ⇒ Object @@ -31034,17 +47058,39 @@

     
     
    -8948
    -8949
    -8950
    -8951
    +3804 +3805 +3806 +3807 +3808 +3809 +3810 +3811 +3812 +3813 +3814 +3815 +3816 +3817 +3818

    @@ -31052,9 +47098,9 @@

    -

    +

    - .github_workflow_template_recipe?(recipe) ⇒ Boolean + .monorepo_root_template_profile?(facts) ⇒ Boolean @@ -31089,15 +47135,15 @@

     
     
    -5072
    -5073
    -5074
    +9403 +9404 +9405

    @@ -31105,60 +47151,61 @@

    -

    - - .github_workflows_include?(project_root, needle) ⇒ Boolean +

    - + .monorepo_subgem_kettle_config_profile_sync_step(project_root, report) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

    -
    # File 'lib/kettle/jem.rb', line 7429
    +      
     
    -def github_funding_urls(path, opencollective_disabled: false)
    -  funding = YAML.safe_load_file(path, permitted_classes: [], aliases: false) || {}
    -  return [] unless funding.is_a?(Hash)
     
    -  funding.flat_map do |platform, value|
    -    next [] if opencollective_disabled && platform.to_s == "open_collective"
    +3831
    +3832
    +3833
    +3834
    +3835
    +3836
    +3837
    +3838
    +3839
    +3840
    +3841
    +3842
    +3843
    +3844
    +
    +
    # File 'lib/kettle/jem.rb', line 3831
     
    -    github_funding_platform_urls(platform.to_s, Array(value).compact)
    -  end
    +def monorepo_root_gemfile_dependency_lines
    +  [
    +    {name: "appraisal2", source: %(gem "appraisal2", "~> 3.2", ">= 3.2.0"\n)},
    +    {name: "bundler-audit", source: %(gem "bundler-audit", "~> 0.9.3"\n)},
    +    {name: "kettle-dev", source: %(gem "kettle-dev", "~> 2.3", ">= 2.3.7"\n)},
    +    {name: "kettle-drift", source: %(gem "kettle-drift", "~> 1.0", ">= 1.0.5"\n)},
    +    {name: "kettle-jem", source: %(gem "kettle-jem", "~> 7.0", ">= 7.0.0"\n)},
    +    {name: "kettle-test", source: %(gem "kettle-test", "~> 2.0", ">= 2.0.11"\n)},
    +    {name: "rake", source: %(gem "rake", "~> 13.0"\n)},
    +    {name: "rspec", source: %(gem "rspec", "~> 3.0"\n)},
    +    {name: "stone_checksums", source: %(gem "stone_checksums", "~> 1.0", ">= 1.0.6"\n)},
    +    {name: "turbo_tests2", source: %(gem "turbo_tests2", "~> 3.2", ">= 3.2.0"\n)}
    +  ].freeze
     end
    -
    # File 'lib/kettle/jem.rb', line 8948
    +      
    # File 'lib/kettle/jem.rb', line 3804
     
    -def github_org_from_url(url)
    -  match = url.to_s.match(%r{\Ahttps?://github\.com/([^/]+)/})
    -  match && match[1]
    +def monorepo_root_gemfile_dependency_sync_step(project_root, report)
    +  facts = report.fetch(:facts)
    +  return unless monorepo_root_template_profile?(facts)
    +
    +  path = File.join(project_root.to_s, "Gemfile")
    +  before = File.exist?(path) ? File.read(path) : %(source "https://gem.coop"\n)
    +  after = ensure_monorepo_root_gemfile_dependencies(before)
    +  File.write(path, after) if after != before
    +  {
    +    name: "monorepo_root_gemfile_dependency_sync",
    +    path: "Gemfile",
    +    status: (after == before) ? "already_current" : "applied",
    +    changed_files: (after == before) ? [] : ["Gemfile"]
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 5072
    +      
    # File 'lib/kettle/jem.rb', line 9403
     
    -def github_workflow_template_recipe?(recipe)
    -  recipe.fetch(:target_path).to_s.start_with?(".github/workflows/")
    +def monorepo_root_template_profile?(facts)
    +  facts[:template_profile].to_s == MONOREPO_ROOT_TEMPLATE_PROFILE
     end
    +
    @@ -31166,9 +47213,9 @@

    -

    +

    - .gitlab_repo_url(repository, repo_slug, suffix) ⇒ Object + .monorepo_subgem_template_entries(gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE) ⇒ Object @@ -31180,31 +47227,27 @@

     
     
    -9100
    -9101
    -9102
    -9103
    -9104
    -9105
    -9106
    -9107
    -9108
    -9109
    -9110
    +9275 +9276 +9277 +9278 +9279 +9280 +9281 +9282 +9283

    @@ -31212,9 +47255,9 @@

    -

    +

    - .html_attribute_escape(value) ⇒ Object + .monorepo_subgem_template_entries_for_profile(gemspec_path, profile) ⇒ Object @@ -31226,15 +47269,31 @@

     
     
    -9449
    -9450
    -9451
    +9285 +9286 +9287 +9288 +9289 +9290 +9291 +9292 +9293 +9294 +9295

    @@ -31242,9 +47301,9 @@

    -

    +

    - .http_url?(value) ⇒ Boolean + .monorepo_subgem_template_profile?(facts) ⇒ Boolean @@ -31279,21 +47338,15 @@

     
     
    -11389
    -11390
    -11391
    -11392
    -11393
    -11394
    +9399 +9400 +9401

    @@ -31301,39 +47354,60 @@

    -

    +

    - .inactive_packaged_template_cleanup_files(project_root, config = {}) ⇒ Object + .monorepo_subgem_template_profile_value?(profile) ⇒ Boolean -

     
     
    -9954
    -9955
    -9956
    -9957
    -9958
    -9959
    -9960
    +3711 +3712 +3713 +3714 +3715 +3716 +3717 +3718 +3719 +3720 +3721 +3722 +3723 +3724 +3725 +3726 +3727 +3728 +3729
    -
    # File 'lib/kettle/jem.rb', line 9954
    +      
    # File 'lib/kettle/jem.rb', line 3711
     
    -def github_workflows_include?(project_root, needle)
    -  Dir.glob(File.join(project_root, ".github/workflows/*.{yml,yaml}")).any? do |path|
    -    File.read(path).include?(needle)
    -  rescue Errno::ENOENT
    -    false
    -  end
    +def monorepo_subgem_kettle_config_profile_sync_step(project_root, report)
    +  facts = report.fetch(:facts)
    +  return unless monorepo_subgem_template_profile?(facts)
    +
    +  profile = normalize_template_profile(facts[:template_profile])
    +  path = File.join(project_root.to_s, KETTLE_CONFIG_PATH)
    +  return unless File.file?(path)
    +
    +  gemspec = facts.dig(:rubygems, :gemspec_path).to_s
    +  before = File.read(path)
    +  after = sync_kettle_config_monorepo_subgem_profile(before, gemspec, profile)
    +  File.write(path, after) if after != before
    +  {
    +    name: "monorepo_subgem_kettle_config_profile_sync",
    +    path: KETTLE_CONFIG_PATH,
    +    status: (after == before) ? "already_current" : "applied",
    +    changed_files: (after == before) ? [] : [KETTLE_CONFIG_PATH]
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 9100
    +      
    # File 'lib/kettle/jem.rb', line 9275
     
    -def gitlab_repo_url(repository, repo_slug, suffix)
    -  resources = repository[:resource_urls] || {}
    -  return resources[:gitlab_issues_url] if suffix == "issues" && resources[:gitlab_issues_url]
    -  return resources[:gitlab_pulls_url] if suffix == "merge_requests" && resources[:gitlab_pulls_url]
    -  return resources[:gitlab_wiki_url] if suffix == "wikis/home" && resources[:gitlab_wiki_url]
    -  return resources[:gitlab_contributors_url] if suffix == "graphs/main" && resources[:gitlab_contributors_url]
    +def monorepo_subgem_template_entries(gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE)
    +  entries = monorepo_subgem_template_entries_for_profile(gemspec_path, profile)
    +  gemspec = gemspec_path.to_s.strip
    +  return entries if gemspec.empty?
     
    -  base = repository[:gitlab_url].to_s
    -  base = "https://gitlab.com/#{repo_slug}" if base.empty?
    -  "#{base}/-/#{suffix}"
    +  entries.insert(1, {"source" => "gem.gemspec", "target" => gemspec})
    +  entries.concat(version_gem_template_entries(gemspec))
    +  entries
     end
    -
    # File 'lib/kettle/jem.rb', line 9449
    +      
    # File 'lib/kettle/jem.rb', line 9285
     
    -def html_attribute_escape(value)
    -  value.to_s.gsub("&", "&amp;").gsub("\"", "&quot;").gsub("<", "&lt;").gsub(">", "&gt;")
    +def monorepo_subgem_template_entries_for_profile(gemspec_path, profile)
    +  case normalize_template_profile(profile)
    +  when MONOREPO_SUBGEM_RELEASE_TEMPLATE_PROFILE
    +    MONOREPO_SUBGEM_RELEASE_TEMPLATE_ENTRIES.dup
    +  when MONOREPO_SUBGEM_FULL_TEMPLATE_PROFILE
    +    project_root = File.dirname(File.expand_path(gemspec_path.to_s))
    +    template_inventory_entries(project_root, PACKAGED_TEMPLATE_ROOT).dup
    +  else
    +    (MONOREPO_SUBGEM_TEMPLATE_ENTRIES + PACKAGED_MODULAR_GEMFILE_TEMPLATE_ENTRIES).uniq
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 11389
    +      
    # File 'lib/kettle/jem.rb', line 9399
     
    -def http_url?(value)
    -  uri = URI.parse(value.to_s)
    -  %w[http https].include?(uri.scheme)
    -rescue URI::InvalidURIError
    -  false
    +def monorepo_subgem_template_profile?(facts)
    +  monorepo_subgem_template_profile_value?(facts[:template_profile])
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -31341,9 +47415,9 @@

    -

    +

    - .inactive_packaged_workflow?(relative_path, config = {}, include_patterns: nil) ⇒ Boolean + .monorepo_template_profile?(facts) ⇒ Boolean @@ -31378,21 +47452,15 @@

     
     
    -7506
    -7507
    -7508
    -7509
    -7510
    -7511
    +9407 +9408 +9409

    @@ -31400,45 +47468,60 @@

    -

    +

    - .inactive_packaged_workflow_cleanup_files(project_root, config = {}, include_patterns: nil) ⇒ Object + .namespace_descendant?(namespace, parent) ⇒ Boolean -

     
     
    -10298
    -10299
    -10300
    -10301
    -10302
    -10303
    -10304
    -10305
    +9415 +9416 +9417 +9418 +9419 +9420 +9421
    -
    # File 'lib/kettle/jem.rb', line 10298
    -
    -def inactive_packaged_template_cleanup_files(project_root, config = {})
    -  Dir.glob(File.join(project_root, "gemfiles/**/*.gemfile")).filter_map do |path|
    -    relative_path = path.delete_prefix("#{project_root}/")
    -    next unless preferred_template_source(PACKAGED_TEMPLATE_ROOT, relative_path)
    +      
    # File 'lib/kettle/jem.rb', line 9415
     
    -    {target_path: relative_path} if skip_packaged_gemfile_template?(relative_path, config)
    -  end.sort_by { |cleanup| cleanup.fetch(:target_path) }
    +def monorepo_subgem_template_profile_value?(profile)
    +  [
    +    MONOREPO_SUBGEM_PACKAGE_TEMPLATE_PROFILE,
    +    MONOREPO_SUBGEM_RELEASE_TEMPLATE_PROFILE,
    +    MONOREPO_SUBGEM_FULL_TEMPLATE_PROFILE
    +  ].include?(normalize_template_profile(profile))
     end
    -
    # File 'lib/kettle/jem.rb', line 7506
    -
    -def inactive_packaged_workflow?(relative_path, config = {}, include_patterns: nil)
    -  return true if stale_versioned_engine_workflow?(relative_path)
    +      
    # File 'lib/kettle/jem.rb', line 9407
     
    -  preferred_template_source(PACKAGED_TEMPLATE_ROOT, relative_path) &&
    -    skip_packaged_workflow_template?(relative_path, config, include_patterns: include_patterns)
    +def monorepo_template_profile?(facts)
    +  monorepo_root_template_profile?(facts) || monorepo_subgem_template_profile?(facts)
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -31446,9 +47529,9 @@

    -

    +

    - .inject_appraisal_gemfiles(block, gemfiles) ⇒ Object + .nested_templating_guard_records(content) ⇒ Object @@ -31460,45 +47543,41 @@

     
     
    -5636
    -5637
    -5638
    -5639
    -5640
    -5641
    -5642
    -5643
    -5644
    -5645
    -5646
    -5647
    -5648
    -5649
    -5650
    -5651
    -5652
    -5653
    +6046 +6047 +6048 +6049 +6050 +6051 +6052 +6053 +6054 +6055 +6056 +6057 +6058 +6059 +6060 +6061

    @@ -31506,83 +47585,60 @@

    -

    +

    - .inject_framework_matrix_workflow_env(content, facts) ⇒ Object + .node_enclosed_by_ranges?(node, ranges) ⇒ Boolean -

     
     
    -7494
    -7495
    -7496
    -7497
    -7498
    -7499
    -7500
    -7501
    -7502
    -7503
    -7504
    +11377 +11378 +11379 +11380 +11381 +11382 +11383
    -
    # File 'lib/kettle/jem.rb', line 7494
    -
    -def inactive_packaged_workflow_cleanup_files(project_root, config = {}, include_patterns: nil)
    -  workflow_root = File.join(project_root, ".github", "workflows")
    -  return [] unless Dir.exist?(workflow_root)
    +      
    # File 'lib/kettle/jem.rb', line 11377
     
    -  Dir.glob(File.join(workflow_root, "*.{yml,yaml}")).filter_map do |path|
    -    relative_path = path.delete_prefix("#{project_root}/")
    -    next if OPT_IN_GITHUB_WORKFLOWS.include?(relative_path)
    +def namespace_descendant?(namespace, parent)
    +  namespace = namespace.to_s
    +  parent = parent.to_s
    +  return false if namespace.empty? || parent.empty? || namespace == parent
     
    -    relative_path if inactive_packaged_workflow?(relative_path, config, include_patterns: include_patterns)
    -  end.sort
    +  namespace.start_with?("#{parent}::")
     end
    -
    # File 'lib/kettle/jem.rb', line 5636
    -
    -def inject_appraisal_gemfiles(block, gemfiles)
    -  lines = block.to_s.lines
    -  existing_paths = ruby_call_records(block, :eval_gemfile).filter_map { |call| ruby_string_argument(call) }.to_set
    -  additions = gemfiles.filter_map do |gemfile|
    -    path = gemfile.to_s.delete_prefix("gemfiles/")
    -    line = %(  eval_gemfile "#{path}") + "\n"
    -    line unless existing_paths.include?(path)
    -  end
    -  return block if additions.empty?
    +      
    # File 'lib/kettle/jem.rb', line 6046
     
    -  insert_line = appraisal_x_stdlib_eval_gemfile_call(block)&.location&.start_line ||
    -    ruby_call_records(block, :appraise).first&.location&.end_line
    -  insert_index = insert_line ? insert_line - 1 : nil
    -  return block unless insert_index
    +def nested_templating_guard_records(content)
    +  result = prism_parse_success(content)
    +  return [] unless result
     
    -  lines.insert(insert_index, *additions)
    -  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
    +  result.value.breadth_first_search_all do |node|
    +    redundant_templating_guard_wrapper_node?(node)
    +  end.map do |node|
    +    inner = node.statements.body.first
    +    {
    +      outer_start_line: node.location.start_line,
    +      outer_end_line: node.location.end_line,
    +      inner_start_line: inner.location.start_line,
    +      inner_end_line: inner.location.end_line
    +    }
    +  end
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -31590,61 +47646,54 @@

    -

    +

    - .inject_standard_appraisal_gemfiles(content, facts) ⇒ Object + .non_default_version_gem_entrypoint?(project_root, entrypoint_require) ⇒ Boolean + + + + +

    +
    + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • +
    - -

     
     
    -4932
    -4933
    -4934
    -4935
    -4936
    -4937
    -4938
    -4939
    -4940
    -4941
    -4942
    -4943
    -4944
    -4945
    -4946
    -4947
    -4948
    -4949
    -4950
    -4951
    -4952
    -4953
    -4954
    -4955
    -4956
    -4957
    -4958
    -4959
    -4960
    -4961
    +6106 +6107 +6108 +6109 +6110 +6111 +6112
    -
    # File 'lib/kettle/jem.rb', line 4932
    -
    -def inject_framework_matrix_workflow_env(content, facts)
    -  env_by_appraisal = framework_matrix_appraisal_env_by_name(facts)
    -  return content if env_by_appraisal.empty?
    -
    -  lines = content.to_s.lines
    -  inserted_keys = Set.new
    -  inserted_locations = Set.new
    -  yaml_mapping_nodes(content).sort_by { |mapping| -mapping.start_line }.each do |mapping|
    -    appraisal = yaml_mapping_scalar_value(mapping, "appraisal")
    -    matrix_env = env_by_appraisal[appraisal]
    -    next unless matrix_env
    -
    -    insert_index = workflow_matrix_env_insert_index(lines, mapping)
    -    next unless insert_index
    -
    -    indent = workflow_matrix_env_indent(lines, mapping)
    -    additions = matrix_env.reject { |key, _value| yaml_mapping_scalar_value(mapping, key) }
    -    additions.reject! { |key, _value| inserted_locations.include?([insert_index, key.to_s]) }
    -    next if additions.empty?
    +      
    # File 'lib/kettle/jem.rb', line 6106
     
    -    additions.each_key { |key| inserted_keys << key }
    -    additions.each_key { |key| inserted_locations << [insert_index, key.to_s] }
    -    lines.insert(insert_index, *additions.map { |key, value| %(#{indent}#{key}: #{yaml_double_quoted_scalar(value)}\n) })
    +def node_enclosed_by_ranges?(node, ranges)
    +  start_line = node.location.start_line
    +  end_line = node.location.end_line
    +  ranges.any? do |range|
    +    range.fetch(:start_line) < start_line && range.fetch(:end_line) > end_line
       end
    -  return content if inserted_keys.empty?
    -
    -  add_framework_matrix_job_env(lines.join, inserted_keys)
    -rescue
    -  content
     end
    +
    @@ -31652,9 +47701,9 @@

    -

    +

    - .insert_after_line_sequence(content, sequence, insertion, error_message) ⇒ Object + .non_mit_licenses?(licenses) ⇒ Boolean @@ -31669,13 +47718,13 @@

    -

    Raises:

    -
      +

      Returns:

      +
      • - (Error) + (Boolean) @@ -31689,35 +47738,15 @@

         
         
        -7070
        -7071
        -7072
        -7073
        -7074
        -7075
        -7076
        -7077
        -7078
        -7079
        -7080
        -7081
        -7082
        +12593 +12594 +12595

    @@ -31725,9 +47754,9 @@

    -

    +

    - .insert_gemfile_dependency_blocks(content, blocks) ⇒ Object + .normalize_changelog(content, facts) ⇒ Object @@ -31739,29 +47768,71 @@

     
     
    -5196
    -5197
    -5198
    -5199
    -5200
    -5201
    -5202
    -5203
    -5204
    -5205
    +4220 +4221 +4222 +4223 +4224 +4225 +4226 +4227 +4228 +4229 +4230 +4231 +4232 +4233 +4234 +4235 +4236 +4237 +4238 +4239 +4240 +4241 +4242 +4243 +4244 +4245 +4246 +4247 +4248 +4249 +4250

    @@ -31769,9 +47840,9 @@

    -

    +

    - .insert_lines_after(content, line_number, insertion) ⇒ Object + .normalize_conditional_body_indentation(source) ⇒ Object @@ -31783,19 +47854,35 @@

     
     
    -6575
    -6576
    -6577
    -6578
    -6579
    +5765 +5766 +5767 +5768 +5769 +5770 +5771 +5772 +5773 +5774 +5775 +5776 +5777

    @@ -31803,9 +47890,9 @@

    -

    +

    - .insert_lines_before(content, line_number, insertion) ⇒ Object + .normalize_eval_gemfile_ruby_bucket(path) ⇒ Object @@ -31817,19 +47904,25 @@

     
     
    -6569
    -6570
    -6571
    -6572
    -6573
    +6962 +6963 +6964 +6965 +6966 +6967 +6968 +6969

    @@ -31837,9 +47930,9 @@

    -

    +

    - .insert_missing_development_gemspec_dependency_lines(content, missing_lines) ⇒ Object + .normalize_gemspec_dependency_version_requirements(source, receiver:, namespace:) ⇒ Object @@ -31851,19 +47944,43 @@

    -6412 -6413 -6414 -6415 -6416 +8275 +8276 +8277 +8278 +8279 +8280 +8281 +8282 +8283 +8284 +8285 +8286 +8287 +8288 +8289 +8290 +8291

    @@ -31871,9 +47988,9 @@

    -

    +

    - .insert_missing_runtime_gemspec_dependency_lines(content, missing_lines, receiver:) ⇒ Object + .normalize_gemspec_project_emoji(line, facts, field:) ⇒ Object @@ -31885,25 +48002,41 @@

    -6403 -6404 -6405 -6406 -6407 -6408 -6409 -6410 +7679 +7680 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694

    @@ -31911,9 +48044,9 @@

    -

    +

    - .insert_yaml_scalar_after_path(content, path, key, value) ⇒ Object + .normalize_gemspec_receiver(line, from:, to:) ⇒ Object @@ -31925,29 +48058,27 @@

     
     
    -6790
    -6791
    -6792
    -6793
    -6794
    -6795
    -6796
    -6797
    -6798
    -6799
    +7669 +7670 +7671 +7672 +7673 +7674 +7675 +7676 +7677

    @@ -31955,9 +48086,9 @@

    -

    +

    - .install_tasksObject + .normalize_generated_image_url(url) ⇒ Object @@ -31969,17 +48100,15 @@

     
     
    -1959
    -1960
    -1961
    -1962
    +11746 +11747 +11748

    @@ -31987,9 +48116,9 @@

    -

    +

    - .json_merge_options(recipe) ⇒ Object + .normalize_generated_rakefile(content) ⇒ Object @@ -32001,33 +48130,85 @@

     
     
    -5748
    -5749
    -5750
    -5751
    -5752
    -5753
    -5754
    -5755
    -5756
    -5757
    -5758
    -5759
    +4873 +4874 +4875 +4876 +4877 +4878 +4879

    + +
     
     
    -5587
    -5588
    -5589
    -5590
    -5591
    -5592
    -5593
    -5594
    -5595
    -5596
    -5597
    -5598
    -5599
    -5600
    -5601
    -5602
    -5603
    -5604
    -5605
    +11353 +11354 +11355 +11356
    -
    # File 'lib/kettle/jem.rb', line 5587
    -
    -def inject_standard_appraisal_gemfiles(content, facts)
    -  gemfiles = facts.to_h.dig(:ci, :standard_appraisal_gemfiles).to_a
    -  return content if gemfiles.empty?
    -
    -  standard_names = standard_test_appraisal_names(content)
    -  return content if standard_names.empty?
    +      
    # File 'lib/kettle/jem.rb', line 11353
     
    -  matrix_dependency_gemfiles = framework_matrix_appraisal_dependency_gemfiles(facts)
    -  parsed = appraisal_blocks(content)
    -  blocks = parsed.fetch(:order).map do |name|
    -    block = parsed.fetch(:blocks).fetch(name)
    -    if standard_names.include?(name) && !appraisal_block_has_matrix_dependency_gemfile?(block, matrix_dependency_gemfiles)
    -      inject_appraisal_gemfiles(block, gemfiles)
    -    else
    -      block
    -    end
    -  end
    -  ensure_trailing_newline(([parsed.fetch(:prelude).to_s.rstrip] + blocks.map(&:rstrip)).reject(&:empty?).join("\n\n"))
    +def non_default_version_gem_entrypoint?(project_root, entrypoint_require)
    +  version_gem_path = File.join("lib", entrypoint_require.to_s, "version_gem.rb")
    +  File.file?(File.join(project_root, version_gem_path))
     end
    -
    # File 'lib/kettle/jem.rb', line 7070
    -
    -def insert_after_line_sequence(content, sequence, insertion, error_message)
    -  lines = content.to_s.lines(chomp: true)
    -  index = (0..(lines.length - sequence.length)).find do |candidate|
    -    lines[candidate, sequence.length] == sequence
    -  end
    -  return content if !index && error_message.nil?
    -  raise Error, error_message unless index
    +      
    # File 'lib/kettle/jem.rb', line 12593
     
    -  insertion_lines = insertion.to_s.lines(chomp: true)
    -  updated = lines.dup
    -  updated.insert(index + sequence.length, *insertion_lines)
    -  "#{updated.join("\n")}\n"
    +def non_mit_licenses?(licenses)
    +  licenses.any? { |license| license != "MIT" }
     end
    -
    # File 'lib/kettle/jem.rb', line 5196
    +      
    # File 'lib/kettle/jem.rb', line 4220
     
    -def insert_gemfile_dependency_blocks(content, blocks)
    -  lines = content.to_s.lines
    -  insert_at = gemfile_dependency_insertion_line(content)
    -  while insert_at.positive? && lines[insert_at - 1].strip.empty?
    -    insert_at -= 1
    +def normalize_changelog(content, facts)
    +  text = content.to_s
    +  title = "# Changelog"
    +  headings = markdown_heading_owners(text, source_label: "CHANGELOG.md")
    +  unless headings.any? { |heading| heading.level == 1 }
    +    text = "#{title}\n\n#{text}"
    +    headings = markdown_heading_owners(text, source_label: "CHANGELOG.md")
       end
    -  insertion = blocks.map { |block| block.strip }.join("\n\n")
    -  lines.insert(insert_at, "#{insertion}\n\n")
    -  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
    +  return ensure_trailing_newline(text) if headings.any? { |heading| heading.level == 2 && changelog_unreleased_heading?(heading.heading_text) }
    +
    +  lines = text.split("\n", -1)
    +  insert_at = headings.find { |heading| heading.level == 2 }&.location&.start_line&.-(1) || lines.length
    +  section = [
    +    "## [Unreleased]",
    +    "",
    +    "### Added",
    +    "",
    +    "### Changed",
    +    "",
    +    "### Deprecated",
    +    "",
    +    "### Removed",
    +    "",
    +    "### Fixed",
    +    "",
    +    "### Security",
    +    ""
    +  ]
    +  lines.insert(insert_at, *section)
    +  ensure_trailing_newline(lines.join("\n").gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 6575
    +      
    # File 'lib/kettle/jem.rb', line 5765
     
    -def insert_lines_after(content, line_number, insertion)
    -  lines = content.to_s.lines
    -  lines.insert(line_number, insertion)
    -  lines.join
    +def normalize_conditional_body_indentation(source)
    +  lines = source.to_s.lines
    +  return source if lines.length < 3
    +
    +  outer_indent = leading_space_count(lines.first)
    +  desired_body_indent = outer_indent + 2
    +  body = lines[1...-1]
    +  min_body_indent = body.reject { |line| line.strip.empty? }.map { |line| leading_space_count(line) }.min
    +  return source unless min_body_indent && min_body_indent > desired_body_indent
    +
    +  remove_spaces = min_body_indent - desired_body_indent
    +  ([lines.first] + body.map { |line| outdent_line(line, remove_spaces) } + [lines.last]).join
     end
    -
    # File 'lib/kettle/jem.rb', line 6569
    +      
    # File 'lib/kettle/jem.rb', line 6962
     
    -def insert_lines_before(content, line_number, insertion)
    -  lines = content.to_s.lines
    -  lines.insert([line_number - 1, 0].max, insertion)
    -  lines.join
    +def normalize_eval_gemfile_ruby_bucket(path)
    +  segments = path.to_s.split("/", -1)
    +  bucket_index = segments.index { |segment| ruby_bucket_path_segment?(segment) }
    +  return unless bucket_index
    +
    +  segments[bucket_index] = "{ruby}"
    +  segments.join("/")
     end
    -
    # File 'lib/kettle/jem.rb', line 6412
    +      
    # File 'lib/kettle/jem.rb', line 8275
     
    -def insert_missing_development_gemspec_dependency_lines(content, missing_lines)
    -  return content if missing_lines.empty?
    +def normalize_gemspec_dependency_version_requirements(source, receiver:, namespace:)
    +  return source if namespace.to_s.empty?
     
    -  insert_lines_before(content, gemspec_end_line(content), missing_lines.join)
    +  replacements = ruby_call_records(source, nil).flat_map do |call|
    +    next [] unless gemspec_dependency_call_kind(call)
    +
    +    Array(call.arguments&.arguments).drop(1).filter_map do |argument|
    +      replacement = ruby_project_version_interpolated_string_source(argument, receiver: receiver, namespace: namespace)
    +      next unless replacement
    +
    +      {start_offset: argument.location.start_offset, end_offset: argument.location.end_offset, replacement: replacement}
    +    end
    +  end
    +  return source if replacements.empty?
    +
    +  replace_source_offsets(source, replacements)
     end
    -
    # File 'lib/kettle/jem.rb', line 6403
    +      
    # File 'lib/kettle/jem.rb', line 7679
     
    -def insert_missing_runtime_gemspec_dependency_lines(content, missing_lines, receiver:)
    -  return content if missing_lines.empty?
    +def normalize_gemspec_project_emoji(line, facts, field:)
    +  return line unless %w[summary description].include?(field.to_s)
    +  return line unless facts&.dig(:project_runtime, :project_emoji_configured)
     
    -  lines = content.to_s.lines
    -  insertion_index = runtime_gemspec_dependency_insertion_index(lines, receiver: receiver)
    -  lines.insert(insertion_index, *missing_lines)
    -  lines.join
    +  project_emoji = facts&.dig(:project_runtime, :project_emoji).to_s
    +  return line if project_emoji.empty?
    +
    +  record = gemspec_assignment_records(line).find { |candidate| candidate.fetch(:field) == field.to_s }
    +  value = record&.fetch(:value)
    +  return line unless value.is_a?(String)
    +  string_node = ruby_first_simple_quoted_string_node(record[:value_node])
    +  return line unless string_node
    +
    +  first_value = string_node.unescaped.to_s
    +  line.sub(first_value, "#{project_emoji} #{strip_leading_decorative_graphemes(first_value)}")
     end
    -
    # File 'lib/kettle/jem.rb', line 6790
    +      
    # File 'lib/kettle/jem.rb', line 7669
     
    -def insert_yaml_scalar_after_path(content, path, key, value)
    -  lines = content.to_s.lines
    -  entry = yaml_scalar_path_entries(content).find { |candidate| candidate.fetch(:path) == path }
    -  return content unless entry
    +def normalize_gemspec_receiver(line, from:, to:)
    +  return line if from.to_s.empty? || to.to_s.empty? || from == to
     
    -  line_index = entry.fetch(:line)
    -  indent = lines[line_index].to_s[/\A\s*/].to_s
    -  lines.insert(line_index + 1, "#{indent}#{key}: #{yaml_config_scalar_literal(value, path: path[0...-1] + [key])}\n")
    -  lines.join
    +  leading = line.to_s.length - line.to_s.lstrip.length
    +  stripped = line.to_s[leading..].to_s
    +  return line unless stripped.start_with?("#{from}.")
    +
    +  "#{line.to_s[0...leading]}#{to}#{stripped[from.to_s.length..]}"
     end
    -
    # File 'lib/kettle/jem.rb', line 1959
    +      
    # File 'lib/kettle/jem.rb', line 11746
     
    -def install_tasks
    -  require "rake"
    -  load(File.expand_path("jem/tasks.rb", __dir__))
    +def normalize_generated_image_url(url)
    +  Addressable::URI.parse(url.to_s).normalize.to_s
     end
    -
    # File 'lib/kettle/jem.rb', line 5748
    +      
    # File 'lib/kettle/jem.rb', line 4873
     
    -def json_merge_options(recipe)
    -  options = {
    -    preference: (recipe.dig(:template_preference, :preference) || "destination").to_sym,
    -    add_template_only_nodes: true,
    -    freeze_token: recipe.dig(:template_preference, :freeze_token) || "kettle-jem"
    -  }
    -  if !recipe.dig(:template_preference, :add_template_only_nodes).nil?
    -    configured = DecisionPolicy.value_to_boolean(recipe.dig(:template_preference, :add_template_only_nodes))
    -    options[:add_template_only_nodes] = configured unless configured.nil?
    +def normalize_generated_rakefile(content)
    +  return "" if content.to_s.empty?
    +
    +  stripped = strip_orphaned_rake_task_requires(content.to_s)
    +  spaced = normalize_rakefile_section_spacing(stripped)
    +  ensure_trailing_newline(spaced.rstrip)
    +end
    +
    +
    + +
    +

    + + .normalize_git_source_url(url) ⇒ Object + + + + + +

    + + + @@ -32035,9 +48216,9 @@

    -

    +

    - .kettle_config_bootstrap_facts(project_root, env, template_selection: {}) ⇒ Object + .normalize_github_actions_exec_cmd(command) ⇒ Object @@ -32049,53 +48230,61 @@

     
     
    -10307
    -10308
    -10309
    -10310
    -10311
    -10312
    -10313
    -10314
    -10315
    -10316
    -10317
    -10318
    -10319
    -10320
    -10321
    -10322
    -10323
    -10324
    -10325
    -10326
    -10327
    -10328
    +13869 +13870 +13871 +13872 +13873 +13874

    + +
    +
    +
    +
    +11930
    +11931
    +11932
    +11933
    +11934
    +11935
    +11936
    +11937
    +11938
    +11939
    +11940
    +11941
    +11942
    +11943
    +11944
    +11945
    +11946
    +11947
    +11948
    +
    +
    # File 'lib/kettle/jem.rb', line 11930
    +
    +def normalize_git_source_url(url)
    +  value = url.to_s.strip
    +  return if value.empty?
    +
    +  if value.start_with?("git@github.com:")
    +    slug = value.split(":", 2).last.to_s.delete_suffix(".git")
    +    return "https://github.com/#{slug}" if slug.split("/").length >= 2
       end
    -  options
    +
    +  uri = URI.parse(value)
    +  if %w[http https].include?(uri.scheme) && uri.host == "github.com"
    +    slug = uri.path.to_s.delete_prefix("/").delete_suffix(".git")
    +    return "https://github.com/#{slug}" if slug.split("/").length >= 2
    +  end
    +
    +  value
    +rescue URI::InvalidURIError
    +  value
     end
    -
    # File 'lib/kettle/jem.rb', line 10307
    +      
    # File 'lib/kettle/jem.rb', line 13869
     
    -def kettle_config_bootstrap_facts(project_root, env, template_selection: {})
    -  return if File.exist?(File.join(project_root, KETTLE_CONFIG_PATH))
    -  return if File.exist?(File.join(project_root, LEGACY_KETTLE_CONFIG_PATH))
    +def normalize_github_actions_exec_cmd(command)
    +  normalized = command.to_s.strip
    +  return "kettle-test" if OBSOLETE_APPRAISAL_SPEC_EXEC_CMDS.include?(normalized)
     
    -  selected_source = preferred_template_source(PACKAGED_TEMPLATE_ROOT, KETTLE_CONFIG_PATH)
    -  return unless selected_source
    +  normalized
    +end
    +
    +
    + +
    +

    + + .normalize_integration_name(name) ⇒ Object + - { - template_preference: { - target_path: KETTLE_CONFIG_PATH, - configured_source: KETTLE_CONFIG_PATH, - selected_source: selected_source, - source_relative_path: selected_source, - source_root: "packaged", - source_root_path: PACKAGED_TEMPLATE_ROOT, - selection_reason: template_source_selection_reason(KETTLE_CONFIG_PATH, selected_source), - apply: true - }, - min_divergence_threshold: preferred_template_token_value(nil, nil, env, "KJ_MIN_DIVERGENCE_THRESHOLD").to_s, - template_profile: template_selection[:template_profile].to_s - }.compact + + + +

    + + + @@ -32103,9 +48292,9 @@

    -

    +

    - .kettle_config_bootstrap_recipe(bootstrap) ⇒ Object + .normalize_kettle_jem_config(config) ⇒ Object @@ -32117,49 +48306,39 @@

     
     
    -10330
    -10331
    -10332
    -10333
    -10334
    -10335
    -10336
    -10337
    -10338
    -10339
    -10340
    -10341
    -10342
    -10343
    -10344
    -10345
    -10346
    -10347
    -10348
    -10349
    +9949 +9950 +9951 +9952 +9953 +9954 +9955 +9956 +9957 +9958 +9959 +9960 +9961 +9962 +9963

    @@ -32167,9 +48346,9 @@

    -

    +

    - .kettle_config_file_override_lines(path, strategy) ⇒ Object + .normalize_list_option(value) ⇒ Object @@ -32181,31 +48360,17 @@

     
     
    -6981
    -6982
    -6983
    -6984
    -6985
    -6986
    -6987
    -6988
    -6989
    -6990
    -6991
    +9505 +9506 +9507 +9508

    @@ -32213,9 +48378,9 @@

    -

    +

    - .kettle_config_template_entries_lines(entries) ⇒ Object + .normalize_main_gemfile_nomono_requirements(content) ⇒ Object @@ -32227,33 +48392,51 @@

     
     
    -3239
    -3240
    -3241
    -3242
    -3243
    -3244
    -3245
    -3246
    -3247
    -3248
    -3249
    -3250
    +5682 +5683 +5684 +5685 +5686 +5687 +5688 +5689 +5690 +5691 +5692 +5693 +5694 +5695 +5696 +5697 +5698 +5699 +5700 +5701 +5702

    @@ -32261,9 +48444,9 @@

    -

    +

    - .kettle_jem_config(project_root) ⇒ Object + .normalize_non_default_version_gem_version_spec(project_root, version_spec_path, entrypoint_require) ⇒ Object @@ -32275,29 +48458,31 @@

     
     
    -7614
    -7615
    -7616
    -7617
    -7618
    -7619
    -7620
    -7621
    -7622
    -7623
    +11385 +11386 +11387 +11388 +11389 +11390 +11391 +11392 +11393 +11394 +11395

    @@ -32305,9 +48490,9 @@

    -

    +

    - .kettle_jem_config_path(project_root) ⇒ Object + .normalize_rakefile_section_spacing(content) ⇒ Object @@ -32319,21 +48504,25 @@

     
     
    -7625
    -7626
    -7627
    -7628
    -7629
    -7630
    +4881 +4882 +4883 +4884 +4885 +4886 +4887 +4888

    @@ -32341,9 +48530,9 @@

    -

    +

    - .kettle_jem_config_relative_path(project_root) ⇒ Object + .normalize_readme_blank_line_runs(content) ⇒ Object @@ -32355,17 +48544,19 @@

     
     
    -7632
    -7633
    -7634
    -7635
    +5103 +5104 +5105 +5106 +5107

    @@ -32373,9 +48564,9 @@

    -

    +

    - .kettle_rb_local_gems(config) ⇒ Object + .normalize_readme_heading(text) ⇒ Object @@ -32387,21 +48578,15 @@

     
     
    -8619
    -8620
    -8621
    -8622
    -8623
    -8624
    +13120 +13121 +13122

    @@ -32409,9 +48594,9 @@

    -

    +

    - .known_license_template_basenamesObject + .normalize_readme_project_heading(content, facts) ⇒ Object @@ -32423,21 +48608,35 @@

     
     
    -10542
    -10543
    -10544
    -10545
    -10546
    -10547
    +5361 +5362 +5363 +5364 +5365 +5366 +5367 +5368 +5369 +5370 +5371 +5372 +5373

    @@ -32445,9 +48644,9 @@

    -

    +

    - .large_business_license_cell(author_email) ⇒ Object + .normalize_readme_section_key(section) ⇒ Object @@ -32459,25 +48658,15 @@

     
     
    -9765
    -9766
    -9767
    -9768
    -9769
    -9770
    -9771
    -9772
    +12771 +12772 +12773

    @@ -32485,9 +48674,9 @@

    -

    +

    - .leading_whitespace(source) ⇒ Object + .normalize_readme_synopsis_heading(content, facts) ⇒ Object @@ -32499,17 +48688,37 @@

     
     
    -6581
    -6582
    -6583
    -6584
    +5375 +5376 +5377 +5378 +5379 +5380 +5381 +5382 +5383 +5384 +5385 +5386 +5387 +5388

    @@ -32517,9 +48726,9 @@

    -

    +

    - .license_badge(spdx_id, ref: :license_ref) ⇒ Object + .normalize_repository_topology(value) ⇒ Object @@ -32531,17 +48740,25 @@

     
     
    -9646
    -9647
    -9648
    -9649
    +9532 +9533 +9534 +9535 +9536 +9537 +9538 +9539

    @@ -32549,9 +48766,9 @@

    -

    +

    - .license_badge_img(spdx_id) ⇒ Object + .normalize_simplecov_template_source(content) ⇒ Object @@ -32563,17 +48780,23 @@

     
     
    -9656
    -9657
    -9658
    -9659
    +5779 +5780 +5781 +5782 +5783 +5784 +5785

    @@ -32581,9 +48804,9 @@

    -

    +

    - .license_badge_ref(spdx_id) ⇒ Object + .normalize_simplecov_track_files_calls(content) ⇒ Object @@ -32595,17 +48818,29 @@

     
     
    -9651
    -9652
    -9653
    -9654
    +5816 +5817 +5818 +5819 +5820 +5821 +5822 +5823 +5824 +5825

    @@ -32613,9 +48848,9 @@

    -

    +

    - .license_compat_badge(category) ⇒ Object + .normalize_spec_helper_simplecov_template_source(content) ⇒ Object @@ -32627,17 +48862,23 @@

     
     
    -9670
    -9671
    -9672
    -9673
    +5845 +5846 +5847 +5848 +5849 +5850 +5851

    @@ -32645,9 +48886,9 @@

    -

    +

    - .license_compat_category(licenses) ⇒ Object + .normalize_template_profile(value) ⇒ Object @@ -32659,25 +48900,33 @@

     
     
    -9661
    -9662
    -9663
    -9664
    -9665
    -9666
    -9667
    -9668
    +9510 +9511 +9512 +9513 +9514 +9515 +9516 +9517 +9518 +9519 +9520 +9521

    @@ -32685,9 +48934,9 @@

    -

    +

    - .license_compat_img(category) ⇒ Object + .normalize_templating_guard_indentation(content) ⇒ Object @@ -32699,17 +48948,37 @@

     
     
    -9723
    -9724
    -9725
    -9726
    +5739 +5740 +5741 +5742 +5743 +5744 +5745 +5746 +5747 +5748 +5749 +5750 +5751 +5752

    @@ -32717,9 +48986,9 @@

    -

    +

    - .license_compat_ref(category) ⇒ Object + .normalized_readme_logo_specs(value) ⇒ Object @@ -32731,15 +49000,43 @@

     
     
    -9719
    -9720
    -9721
    +12033 +12034 +12035 +12036 +12037 +12038 +12039 +12040 +12041 +12042 +12043 +12044 +12045 +12046 +12047 +12048 +12049

    @@ -32747,9 +49044,9 @@

    -

    +

    - .license_contact_line(author_email, context:) ⇒ Object + .normalized_readme_logo_width(value) ⇒ Object @@ -32761,31 +49058,21 @@

     
     
    -9614
    -9615
    -9616
    -9617
    -9618
    -9619
    -9620
    -9621
    -9622
    -9623
    -9624
    +12051 +12052 +12053 +12054 +12055 +12056

    @@ -32793,9 +49080,9 @@

    -

    - .license_copyright_notice(copyright_lines, copyright_prefix, author) ⇒ Object + .normalized_readme_top_logo_options(value) ⇒ Object @@ -32807,17 +49094,15 @@

    @@ -32825,59 +49110,52 @@
    +
    +
    +
    +12850
    +12851
    +12852
    +12853
    +12854
    +12855
    +12856
    +12857
    +
    +
    # File 'lib/kettle/jem.rb', line 12850
    +
    +def normalize_integration_name(name)
    +  normalized = name.to_s.tr("_", "-").downcase
    +  return "codecov" if normalized == "code-cov"
    +  return "codeql" if normalized == "code-ql"
    +  return SKYWALKING_EYES_INTEGRATION if %w[license-eye license-eyes skywalking-eye skywalking-eyes apache-skywalking-eyes].include?(normalized)
    +
    +  normalized
     end
    -
    # File 'lib/kettle/jem.rb', line 10330
    +      
    # File 'lib/kettle/jem.rb', line 9949
     
    -def kettle_config_bootstrap_recipe(bootstrap)
    -  recipe = recipe_entry(
    -    "kettle_config_bootstrap",
    -    KETTLE_CONFIG_PATH,
    -    "yaml",
    -    "supplied_kettle_config_bootstrap",
    -    facts: %w[kettle_config_bootstrap]
    -  )
    -  recipe[:template_preference] = bootstrap.fetch(:template_preference)
    -  recipe[:template_tokens] = {
    -    "KJ|MIN_DIVERGENCE_THRESHOLD" => bootstrap.fetch(:min_divergence_threshold).to_s,
    -    "KJ|MIN_RUBY" => bootstrap[:min_ruby].to_s,
    -    "KJ|MIN_TEST_RUBY" => bootstrap[:test_min_ruby].to_s
    -  }
    -  recipe[:bootstrap_licenses] = Array(bootstrap[:licenses]).map(&:to_s).reject(&:empty?)
    -  recipe[:bootstrap_template_profile] = bootstrap[:template_profile].to_s unless bootstrap[:template_profile].to_s.empty?
    -  recipe[:bootstrap_gemspec_path] = bootstrap[:gemspec_path].to_s unless bootstrap[:gemspec_path].to_s.empty?
    -  recipe[:bootstrap_project_emoji] = bootstrap[:project_emoji].to_s unless bootstrap[:project_emoji].to_s.empty?
    -  recipe
    +def normalize_kettle_jem_config(config)
    +  return config unless config.is_a?(Hash)
    +
    +  files = config["files"]
    +  return config unless files.is_a?(Hash)
    +
    +  simplecov_config = files[".simplecov"]
    +  return config unless simplecov_config.is_a?(Hash)
    +  return config unless simplecov_config.keys == ["strategy"] && simplecov_config["strategy"].to_s == "keep_destination"
    +
    +  normalized = config.dup
    +  normalized["files"] = files.dup
    +  normalized["files"].delete(".simplecov")
    +  normalized
     end
    -
    # File 'lib/kettle/jem.rb', line 6981
    +      
    # File 'lib/kettle/jem.rb', line 9505
     
    -def kettle_config_file_override_lines(path, strategy)
    -  parts = path.to_s.split("/")
    -  parts.each_with_index.flat_map do |part, index|
    -    indent = "  " * (index + 1)
    -    if index == parts.length - 1
    -      ["#{indent}#{part}:", "#{"  " * (index + 2)}strategy: #{strategy}"]
    -    else
    -      ["#{indent}#{part}:"]
    -    end
    -  end
    +def normalize_list_option(value)
    +  values = Array(value).flat_map { |entry| entry.to_s.split(",") }.map(&:strip).reject(&:empty?)
    +  values.empty? ? nil : values
     end
    -
    # File 'lib/kettle/jem.rb', line 3239
    +      
    # File 'lib/kettle/jem.rb', line 5682
     
    -def kettle_config_template_entries_lines(entries)
    -  ["  entries:", *entries.flat_map do |entry|
    -    if entry.is_a?(Hash)
    -      [
    -        "    - source: #{entry.fetch("source")}",
    -        "      target: #{entry.fetch("target")}"
    -      ]
    -    else
    -      ["    - #{entry}"]
    -    end
    -  end]
    +def normalize_main_gemfile_nomono_requirements(content)
    +  records = main_gemfile_nomono_requirement_records(content)
    +  return content if records.fetch(:calls).empty? || records.fetch(:assignments).empty?
    +
    +  assignment_source = records.fetch(:assignments).first.fetch(:source).strip
    +  output = records.fetch(:assignments).sort_by { |record| -record.fetch(:start_line) }.reduce(content.to_s) do |memo, record|
    +    replace_source_range_lines(
    +      memo,
    +      record.fetch(:start_line),
    +      expand_line_range_through_following_blanks(memo, record.fetch(:end_line)),
    +      ""
    +    )
    +  end
    +  call = main_gemfile_nomono_requirement_records(output).fetch(:calls).first
    +  return output unless call
    +
    +  lines = output.lines
    +  insert_at = call.fetch(:start_line) - 1
    +  lines.insert(insert_at, "#{assignment_source}\n")
    +  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 7614
    +      
    # File 'lib/kettle/jem.rb', line 11385
     
    -def kettle_jem_config(project_root)
    -  path = kettle_jem_config_path(project_root)
    -  return {} unless File.exist?(path)
    +def normalize_non_default_version_gem_version_spec(project_root, version_spec_path, entrypoint_require)
    +  current = read_project_file(project_root, version_spec_path)
    +  return if current.empty?
     
    -  config = YAML.safe_load_file(path, permitted_classes: [], aliases: false) || {}
    -  validate_kettle_jem_config!(config)
    -  config
    -rescue Psych::SyntaxError => error
    -  raise Error, "Invalid #{kettle_jem_config_relative_path(project_root)}: #{error.message}"
    +  require_path = File.join(entrypoint_require.to_s, "version_gem")
    +  return if ruby_top_level_require?(current, "require", require_path)
    +
    +  lines = current.lines
    +  lines.insert(version_spec_require_insertion_index(current), %(require "#{require_path}"\n))
    +  write_if_changed(project_root, version_spec_path, collapse_excess_blank_lines(lines.join))
     end
    -
    # File 'lib/kettle/jem.rb', line 7625
    -
    -def kettle_jem_config_path(project_root)
    -  canonical = File.join(project_root, KETTLE_CONFIG_PATH)
    -  return canonical if File.exist?(canonical)
    +      
    # File 'lib/kettle/jem.rb', line 4881
     
    -  File.join(project_root, LEGACY_KETTLE_CONFIG_PATH)
    +def normalize_rakefile_section_spacing(content)
    +  content.to_s.lines.each_with_object([]) do |line, normalized|
    +    if line.start_with?("### ")
    +      normalized.pop while normalized.length > 1 && normalized[-1].strip.empty? && normalized[-2].strip.empty?
    +    end
    +    normalized << line
    +  end.join
     end
    -
    # File 'lib/kettle/jem.rb', line 7632
    +      
    # File 'lib/kettle/jem.rb', line 5103
     
    -def kettle_jem_config_relative_path(project_root)
    -  path = kettle_jem_config_path(project_root)
    -  File.expand_path(path).delete_prefix("#{File.expand_path(project_root.to_s)}/")
    +def normalize_readme_blank_line_runs(content)
    +  return Ast::Merge.normalize_blank_line_runs(content) if Ast::Merge.respond_to?(:normalize_blank_line_runs)
    +
    +  collapse_excess_blank_lines(content)
     end
    -
    # File 'lib/kettle/jem.rb', line 8619
    +      
    # File 'lib/kettle/jem.rb', line 13120
     
    -def kettle_rb_local_gems(config)
    -  gems = %w[kettle-dev kettle-test kettle-soup-cover]
    -  plugin_names = PluginLoader.normalize_plugin_names(plugin_names_from_config(config))
    -  gems.concat(plugin_names.select { |plugin_name| plugin_name.start_with?("kettle-") })
    -  gems.uniq.join(" ")
    +def normalize_readme_heading(text)
    +  strip_readme_heading_adornment(text).strip.downcase
     end
    -
    # File 'lib/kettle/jem.rb', line 10542
    +      
    # File 'lib/kettle/jem.rb', line 5361
     
    -def known_license_template_basenames
    -  @known_license_template_basenames ||= Dir.glob(File.join(PACKAGED_TEMPLATE_ROOT, "*.md.example"))
    -    .map { |path| File.basename(path, ".md.example") }
    -    .reject { |basename| NON_LICENSE_MD_BASENAMES.include?(basename) }
    -    .to_set
    +def normalize_readme_project_heading(content, facts)
    +  namespace = facts.dig(:rubygems, :namespace).to_s
    +  emoji = facts.dig(:project_runtime, :project_emoji).to_s
    +  return content if namespace.empty? || emoji.empty?
    +
    +  lines = content.to_s.split("\n", -1)
    +  h1 = markdown_heading_owners(content, source_label: "README.md").find { |owner| owner.level == 1 }
    +  return content unless h1
    +
    +  index = h1.location.start_line - 1
    +  lines[index] = "# #{emoji} #{namespace}"
    +  lines.join("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 9765
    +      
    # File 'lib/kettle/jem.rb', line 12771
     
    -def large_business_license_cell(author_email)
    -  cell = license_link("LicenseRef-Big-Time-Public-License")
    -  if author_email.to_s.empty?
    -    "#{cell} or contact us for a custom license"
    -  else
    -    "#{cell} or [contact us](mailto:#{author_email}) for a custom license"
    -  end
    +def normalize_readme_section_key(section)
    +  normalize_readme_heading(section.to_s.tr("_-", " "))
     end
    -
    # File 'lib/kettle/jem.rb', line 6581
    +      
    # File 'lib/kettle/jem.rb', line 5375
     
    -def leading_whitespace(source)
    -  text = source.to_s
    -  text[0...(text.length - text.lstrip.length)]
    +def normalize_readme_synopsis_heading(content, facts)
    +  logo_row = facts.dig(:readme_logo, :h2_synopsis_logo_row).to_s
    +  return content if logo_row.empty?
    +
    +  lines = content.to_s.split("\n", -1)
    +  h2 = markdown_heading_owners(content, source_label: "README.md").find do |owner|
    +    owner.level == 2 && owner.base.to_s == "synopsis"
    +  end
    +  return content unless h2
    +
    +  index = h2.location.start_line - 1
    +  lines[index] = "## 🌻 Synopsis #{logo_row}"
    +  lines.join("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 9646
    +      
    # File 'lib/kettle/jem.rb', line 9532
     
    -def license_badge(spdx_id, ref: :license_ref)
    -  base = spdx_basename(spdx_id)
    -  "[![License: #{base}][#{paperclip_ref(:license_img)}]][#{paperclip_ref(ref)}]"
    +def normalize_repository_topology(value)
    +  topology = value.to_s.strip.downcase.tr("_", "-")
    +  return "" if topology.empty?
    +  return REPOSITORY_TOPOLOGY_MONOREPO_SUBPROJECT if %w[monorepo-subproject monorepo-subgem monorepo-package subproject subgem].include?(topology)
    +  return REPOSITORY_TOPOLOGY_STANDALONE if %w[standalone single-repo repo].include?(topology)
    +
    +  topology
     end
    -
    # File 'lib/kettle/jem.rb', line 9656
    +      
    # File 'lib/kettle/jem.rb', line 5779
     
    -def license_badge_img(spdx_id)
    -  base = spdx_basename(spdx_id).gsub("-", "--").gsub("_", "__").tr(" ", "_")
    -  "https://img.shields.io/badge/License-#{base}-259D6C.svg"
    +def normalize_simplecov_template_source(content)
    +  nodes = simplecov_obsolete_call_nodes(content)
    +  output = nodes.sort_by { |node| -node.location.start_line }.reduce(content.to_s) do |output, node|
    +    replace_source_range_lines(output, node.location.start_line, expand_line_range_through_following_blanks(output, node.location.end_line), "")
    +  end
    +  normalize_simplecov_track_files_calls(output)
     end
    -
    # File 'lib/kettle/jem.rb', line 9651
    +      
    # File 'lib/kettle/jem.rb', line 5816
     
    -def license_badge_ref(spdx_id)
    -  base = spdx_basename(spdx_id)
    -  base.include?(" OR ") ? "LICENSE.md" : "#{base}.md"
    +def normalize_simplecov_track_files_calls(content)
    +  records = simplecov_track_files_call_records(content)
    +  return content if records.empty?
    +
    +  records.sort_by { |record| -record.fetch(:start_line) }.reduce(content.to_s) do |output, record|
    +    indent = leading_whitespace(record.fetch(:source))
    +    replacement = "#{indent}cover #{record.fetch(:arguments_source)}\n"
    +    replace_source_range_lines(output, record.fetch(:start_line), record.fetch(:end_line), replacement)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 9670
    +      
    # File 'lib/kettle/jem.rb', line 5845
     
    -def license_compat_badge(category)
    -  data = APACHE_LICENSE_COMPAT_BADGE_DATA.fetch(category)
    -  "[![#{data.fetch(:alt)}][#{paperclip_ref(:license_compat_img)}]][#{paperclip_ref(:license_compat)}]"
    +def normalize_spec_helper_simplecov_template_source(content)
    +  output = remove_duplicate_simplecov_do_cov_bootstrap_blocks(content)
    +  output = ensure_spec_helper_simplecov_do_cov_bootstrap(output)
    +  output = remove_duplicate_simplecov_requires(output)
    +  output = ensure_spec_helper_simplecov_config_require(output)
    +  ensure_spec_helper_simplecov_start(output)
     end
    -
    # File 'lib/kettle/jem.rb', line 9661
    +      
    # File 'lib/kettle/jem.rb', line 9510
     
    -def license_compat_category(licenses)
    -  categories = Array(licenses).filter_map { |license| APACHE_LICENSE_COMPAT_CATEGORIES[license.to_s] }.uniq
    -  return :a if categories.include?(:a)
    -  return :b if categories.include?(:b)
    -  return :x if categories.any? && categories.all?(:x)
    +def normalize_template_profile(value)
    +  profile = value.to_s.strip.downcase.tr("_", "-")
    +  return "" if profile.empty?
    +  return FULL_TEMPLATE_PROFILE if %w[full large default standalone].include?(profile)
    +  return MONOREPO_SUBGEM_PACKAGE_TEMPLATE_PROFILE if %w[monorepo-subgem monorepo-subproject monorepo-package monorepo-subgem-package small thin package].include?(profile)
    +  return MONOREPO_SUBGEM_RELEASE_TEMPLATE_PROFILE if %w[monorepo-subgem-release monorepo-release release].include?(profile)
    +  return MONOREPO_SUBGEM_FULL_TEMPLATE_PROFILE if %w[monorepo-subgem-full monorepo-full subgem-full].include?(profile)
    +  return MONOREPO_ROOT_TEMPLATE_PROFILE if profile == MONOREPO_ROOT_TEMPLATE_PROFILE
    +  return SHIM_TEMPLATE_PROFILE if %w[shim shim-gem compatibility-shim compat-shim].include?(profile)
     
    -  :unknown
    +  profile
     end
    -
    # File 'lib/kettle/jem.rb', line 9723
    +      
    # File 'lib/kettle/jem.rb', line 5739
     
    -def license_compat_img(category)
    -  data = APACHE_LICENSE_COMPAT_BADGE_DATA.fetch(category)
    -  "https://img.shields.io/badge/#{data.fetch(:label)}-#{data.fetch(:message)}-#{data.fetch(:color)}.svg?style=flat&logo=Apache"
    +def normalize_templating_guard_indentation(content)
    +  records = templating_guard_records(content)
    +  return content if records.empty?
    +
    +  output = content.to_s
    +  records.sort_by { |record| -record.fetch(:start_line) }.each do |record|
    +    source = output.lines[(record.fetch(:start_line) - 1)..(record.fetch(:end_line) - 1)].join
    +    normalized = normalize_conditional_body_indentation(source)
    +    next if normalized == source
    +
    +    output = replace_source_range_lines(output, record.fetch(:start_line), record.fetch(:end_line), normalized)
    +  end
    +  output
     end
    -
    # File 'lib/kettle/jem.rb', line 9719
    +      
    # File 'lib/kettle/jem.rb', line 12033
     
    -def license_compat_ref(category)
    -  APACHE_LICENSE_COMPAT_BADGE_DATA.fetch(category).fetch(:ref)
    +def normalized_readme_logo_specs(value)
    +  raw_values = case value
    +  when String
    +    value.split(",")
    +  when Array
    +    value
    +  else
    +    []
    +  end
    +  raw_values.filter_map do |raw_value|
    +    raw_type, raw_width = raw_value.to_s.split("|", 2)
    +    normalized = raw_type.to_s.strip.downcase.tr("-", "_")
    +    next unless README_TOP_LOGO_OPTIONS.include?(normalized)
    +
    +    {type: normalized, width: normalized_readme_logo_width(raw_width)}
    +  end.uniq
     end
    -
    # File 'lib/kettle/jem.rb', line 9614
    +      
    # File 'lib/kettle/jem.rb', line 12051
     
    -def license_contact_line(author_email, context:)
    -  if author_email.to_s.empty?
    -    return "If none of the above licenses fit your use case, please contact the project maintainer to discuss a custom commercial license." if context == :license_md
    +def normalized_readme_logo_width(value)
    +  clean = value.to_s.strip
    +  return nil if clean.empty?
     
    -    "If none of the available licenses suit your use case, please contact the project maintainer to discuss a custom commercial license."
    -  elsif context == :license_md
    -    "If none of the above licenses fit your use case, please [contact us](mailto:#{author_email}) to discuss a custom commercial license."
    -  else
    -    "If none of the available licenses suit your use case, please [contact us](mailto:#{author_email}) to discuss a custom commercial license."
    -  end
    +  clean
     end
    -
    # File 'lib/kettle/jem.rb', line 9557
    +      
    # File 'lib/kettle/jem.rb', line 12029
     
    -def license_copyright_notice(copyright_lines, copyright_prefix, author)
    -  lines = copyright_notice_lines(copyright_lines, copyright_prefix, author).map { |line| "- #{line}" }
    -  "## Copyright Notice\n\n#{lines.join("\n")}"
    +def normalized_readme_top_logo_options(value)
    +  normalized_readme_logo_specs(value).map { |spec| spec.fetch(:type) }
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -32885,39 +49163,52 @@

    -

    +

    + + .opencollective_disabled_file?(relative_path) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    - .license_eye_dependency_licenses(config) ⇒ Object +

    Returns:

    +
      - +
    • + + + (Boolean) + + + +
    • +
    - -

     
     
    -9700
    -9701
    -9702
    -9703
    -9704
    -9705
    -9706
    -9707
    -9708
    -9709
    -9710
    -9711
    -9712
    -9713
    -9714
    -9715
    -9716
    -9717
    +10194 +10195 +10196
    -
    # File 'lib/kettle/jem.rb', line 9700
    -
    -def license_eye_dependency_license_entry(entry)
    -  data = if entry.is_a?(Hash)
    -    entry
    -  else
    -    {}
    -  end
    -  name = data["name"] || data[:name]
    -  license = data["license"] || data[:license]
    -  version = data["version"] || data[:version]
    -  return if name.to_s.strip.empty? || license.to_s.strip.empty?
    +      
    # File 'lib/kettle/jem.rb', line 10194
     
    -  lines = [
    -    "    - name: #{JSON.generate(name.to_s.strip)}",
    -    "      license: #{JSON.generate(license.to_s.strip)}"
    -  ]
    -  lines.insert(1, "      version: #{JSON.generate(version.to_s.strip)}") unless version.to_s.strip.empty?
    -  lines
    +def opencollective_disabled?(config, env: ENV)
    +  opencollective_policy(config, env).fetch(:disabled)
     end
    +
    @@ -32925,9 +49216,9 @@

    -

    +

    - .license_eye_flags(licenses) ⇒ Object + .opencollective_disabled_files(project_root) ⇒ Object @@ -32939,15 +49230,19 @@

     
     
    -9687
    -9688
    -9689
    +9871 +9872 +9873 +9874 +9875

    @@ -32955,9 +49250,9 @@

    -

    +

    - .license_eye_mode(licenses) ⇒ Object + .opencollective_fallback_warnings(funding, github_org) ⇒ Object @@ -32969,15 +49264,29 @@

     
     
    -9683
    -9684
    -9685
    +10247 +10248 +10249 +10250 +10251 +10252 +10253 +10254 +10255 +10256

    @@ -32985,9 +49294,9 @@

    -

    +

    - .license_eye_primary_spdx(licenses, fallback) ⇒ Object + .opencollective_falsey_env(env) ⇒ Object @@ -32999,15 +49308,23 @@

     
     
    -9679
    -9680
    -9681
    +10220 +10221 +10222 +10223 +10224 +10225 +10226

    @@ -33015,9 +49332,9 @@

    -

    +

    - .license_eye_workflow_badge(licenses) ⇒ Object + .opencollective_org(project_root, config, env, opencollective_disabled: false) ⇒ Object @@ -33029,15 +49346,37 @@

     
     
    -9675
    -9676
    -9677
    +10228 +10229 +10230 +10231 +10232 +10233 +10234 +10235 +10236 +10237 +10238 +10239 +10240 +10241

    @@ -33045,9 +49384,9 @@

    -

    +

    - .license_facts(config, gemspec_licenses, author: {}, author_email: nil, copyright: {}) ⇒ Object + .opencollective_org_config(config) ⇒ Object @@ -33059,59 +49398,33 @@

     
     
    -9503
    -9504
    -9505
    -9506
    -9507
    -9508
    -9509
    -9510
    -9511
    -9512
    -9513
    -9514
    -9515
    -9516
    -9517
    -9518
    -9519
    -9520
    -9521
    -9522
    -9523
    -9524
    -9525
    -9526
    -9527
    +10258 +10259 +10260 +10261 +10262 +10263 +10264 +10265 +10266 +10267 +10268 +10269

    @@ -33119,9 +49432,9 @@

    -

    - .license_link(spdx_id) ⇒ Object + .opencollective_org_env(env) ⇒ Object @@ -33133,17 +49446,27 @@

    @@ -33151,9 +49474,9 @@ @@ -33203,9 +49522,9 @@

    -

    +

    - .license_template_tokens(license) ⇒ Object + .opencollective_org_github_funding_file(project_root) ⇒ Object @@ -33217,45 +49536,33 @@

     
     
    -9538
    -9539
    -9540
    -9541
    -9542
    -9543
    -9544
    -9545
    -9546
    -9547
    -9548
    -9549
    -9550
    -9551
    -9552
    -9553
    -9554
    -9555
    +10294 +10295 +10296 +10297 +10298 +10299 +10300 +10301 +10302 +10303 +10304 +10305

    @@ -33263,9 +49570,9 @@

    -

    +

    - .license_use_case_guide_table(licenses, author_email: nil) ⇒ Object + .opencollective_policy(config, env) ⇒ Object @@ -33277,33 +49584,51 @@

     
     
    -9736
    -9737
    -9738
    -9739
    -9740
    -9741
    -9742
    -9743
    -9744
    -9745
    -9746
    -9747
    +10198 +10199 +10200 +10201 +10202 +10203 +10204 +10205 +10206 +10207 +10208 +10209 +10210 +10211 +10212 +10213 +10214 +10215 +10216 +10217 +10218

    @@ -33311,9 +49636,9 @@

    -

    +

    - .license_use_case_rows(licenses, author_email: nil) ⇒ Object + .opt_in_workflow_cleanup_files(project_root, template_selection) ⇒ Object @@ -33325,39 +49650,23 @@

     
     
    -9749
    -9750
    -9751
    -9752
    -9753
    -9754
    -9755
    -9756
    -9757
    -9758
    -9759
    -9760
    -9761
    -9762
    -9763
    +9845 +9846 +9847 +9848 +9849 +9850 +9851

    @@ -33365,9 +49674,9 @@

    -

    +

    - .load_project_gemspec(gemspec_path) ⇒ Object + .outdent_line(line, spaces) ⇒ Object @@ -33379,19 +49688,19 @@

     
     
    -8592
    -8593
    -8594
    -8595
    -8596
    +6040 +6041 +6042 +6043 +6044

    @@ -33399,52 +49708,31 @@

    -

    - - .local_gemfile_template_recipe?(recipe) ⇒ Boolean +

    - + .outdent_source(source, spaces) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -9691
    -9692
    -9693
    -9694
    -9695
    -9696
    -9697
    -9698
    +9877 +9878 +9879
    -
    # File 'lib/kettle/jem.rb', line 9691
    +      
    # File 'lib/kettle/jem.rb', line 9877
     
    -def license_eye_dependency_licenses(config)
    -  entries = Array(config.dig("license_eye", "dependency_licenses")).filter_map do |entry|
    -    license_eye_dependency_license_entry(entry)
    -  end
    -  return "" if entries.empty?
    -
    -  ["  licenses:", *entries].join("\n")
    +def opencollective_disabled_file?(relative_path)
    +  OPENCOLLECTIVE_DISABLED_FILES.include?(relative_path.to_s)
     end
    -
    # File 'lib/kettle/jem.rb', line 9687
    +      
    # File 'lib/kettle/jem.rb', line 9871
     
    -def license_eye_flags(licenses)
    -  (license_eye_mode(licenses) == "check") ? "--weak-compatible" : ""
    +def opencollective_disabled_files(project_root)
    +  OPENCOLLECTIVE_DISABLED_FILES.select do |relative_path|
    +    File.exist?(File.join(project_root, relative_path))
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 9683
    +      
    # File 'lib/kettle/jem.rb', line 10247
     
    -def license_eye_mode(licenses)
    -  (Array(licenses).map(&:to_s).any? { |license| LICENSE_EYE_COMPATIBILITY_LICENSES.include?(license) }) ? "check" : "resolve"
    +def opencollective_fallback_warnings(funding, github_org)
    +  return [] unless funding[:open_collective_org_source].to_s == "fallback.default"
    +
    +  clean_github_org = github_org.to_s.strip
    +  return [] if clean_github_org.empty? || clean_github_org == DEFAULT_OPENCOLLECTIVE_ORG
    +
    +  [
    +    "OpenCollective funding org defaulted to #{DEFAULT_OPENCOLLECTIVE_ORG.inspect}, but the GitHub org is #{clean_github_org.inspect}. Configure funding.open_collective or FUNDING_ORG if this is not intended."
    +  ]
     end
    -
    # File 'lib/kettle/jem.rb', line 9679
    +      
    # File 'lib/kettle/jem.rb', line 10220
     
    -def license_eye_primary_spdx(licenses, fallback)
    -  Array(licenses).map(&:to_s).find { |license| LICENSE_EYE_COMPATIBILITY_LICENSES.include?(license) } || fallback
    +def opencollective_falsey_env(env)
    +  %w[OPENCOLLECTIVE_HANDLE FUNDING_ORG].each do |key|
    +    value = env[key]
    +    return {key: key, value: value} if falsey_config?(value)
    +  end
    +  nil
     end
    -
    # File 'lib/kettle/jem.rb', line 9675
    +      
    # File 'lib/kettle/jem.rb', line 10228
    +
    +def opencollective_org(project_root, config, env, opencollective_disabled: false)
    +  return if opencollective_disabled
    +
    +  env_org = opencollective_org_env(env)
    +  return env_org if env_org
    +
    +  config_org = opencollective_org_config(config)
    +  return config_org if config_org
    +
    +  funding_org = opencollective_org_github_funding_file(project_root)
    +  return funding_org if funding_org
     
    -def license_eye_workflow_badge(licenses)
    -  Array(licenses).map(&:to_s).include?("MIT") ? README_LICENSE_EYE_WORKFLOW_BADGE : ""
    +  opencollective_org_file(project_root)
     end
    -
    # File 'lib/kettle/jem.rb', line 9503
    +      
    # File 'lib/kettle/jem.rb', line 10258
     
    -def license_facts(config, gemspec_licenses, author: {}, author_email: nil, copyright: {})
    -  licenses = resolved_licenses(config, gemspec_licenses)
    -  primary = licenses.first
    -  compat_category = license_compat_category(licenses)
    -  copyright_prefix = polyform_licenses?(licenses) ? "Required Notice: " : ""
    -  copyright_lines = Array(copyright[:lines])
    -  compact_hash(
    -    spdx: licenses,
    -    expression: licenses.join(" OR "),
    -    primary_spdx: primary,
    -    license_md_content: license_md_content(licenses, author_email: author_email),
    -    readme_license_intro: readme_license_intro(licenses, author_email: author_email),
    -    readme_license_badge: license_badge(licenses.join(" OR "), ref: :license),
    -    readme_license_compat_badge: license_compat_badge(compat_category),
    -    readme_license_eye_workflow_badge: license_eye_workflow_badge(licenses),
    -    readme_license_refs: readme_license_refs(licenses.join(" OR "), compat_category),
    -    license_eye_primary_spdx: license_eye_primary_spdx(licenses, primary),
    -    license_eye_mode: license_eye_mode(licenses),
    -    license_eye_flags: license_eye_flags(licenses),
    -    license_eye_dependency_licenses: license_eye_dependency_licenses(config),
    -    license_copyright_notice: license_copyright_notice(copyright_lines, copyright_prefix, author),
    -    readme_copyright_notice: readme_copyright_notice(copyright_lines, copyright_prefix, author),
    -    copyright_prefix: copyright_prefix
    -  )
    +def opencollective_org_config(config)
    +  funding = config["funding"]
    +  return unless funding.is_a?(Hash) && funding.key?("open_collective")
    +
    +  value = funding["open_collective"]
    +  return if value == true || falsey_config?(value)
    +
    +  org = value.to_s.strip
    +  return if org.empty?
    +
    +  {org: org, source: "config.funding.open_collective"}
     end
    -
    # File 'lib/kettle/jem.rb', line 9641
    +      
    # File 'lib/kettle/jem.rb', line 10271
     
    -def license_link(spdx_id)
    -  base = spdx_basename(spdx_id)
    -  "[#{base}](#{base}.md)"
    +def opencollective_org_env(env)
    +  %w[OPENCOLLECTIVE_HANDLE FUNDING_ORG].each do |key|
    +    value = env[key].to_s.strip
    +    next if value.empty? || falsey_config?(value)
    +
    +    return {org: value, source: "env.#{key}"}
    +  end
    +  nil
     end
    -
    # File 'lib/kettle/jem.rb', line 9582
    +      
    # File 'lib/kettle/jem.rb', line 10281
     
    -def license_md_content(licenses, author_email: nil)
    -  content = <<~MARKDOWN.chomp
    -    # License
    -
    -    This project is made available under the following license#{"s" if licenses.size > 1}.
    -    Choose the option that best fits your use case:
    -
    -    #{licenses.map { |license| "- #{license_link(license)}" }.join("\n")}
    -  MARKDOWN
    -  guide_table = license_use_case_guide_table(licenses, author_email: author_email)
    -  content += "\n\n## Use-case guide\n\n#{guide_table}" if guide_table
    -  content += "\n\n#{license_contact_line(author_email, context: :license_md)}" if non_mit_licenses?(licenses)
    -  content
    +def opencollective_org_file(project_root)
    +  path = File.join(project_root, ".opencollective.yml")
    +  return unless File.exist?(path)
    +
    +  config = YAML.safe_load_file(path, permitted_classes: [], aliases: false) || {}
    +  return unless config.is_a?(Hash)
    +
    +  org = config.fetch("collective", config["org"]).to_s.strip
    +  return if org.empty?
    +
    +  {org: org, source: ".opencollective.yml"}
     end
    -
    # File 'lib/kettle/jem.rb', line 9538
    +      
    # File 'lib/kettle/jem.rb', line 10294
     
    -def license_template_tokens(license)
    -  {
    -    "KJ|LICENSE_MD_CONTENT" => license[:license_md_content].to_s,
    -    "KJ|README:LICENSE_INTRO" => license[:readme_license_intro].to_s,
    -    "KJ|LICENSE:PRIMARY_SPDX" => license[:primary_spdx].to_s,
    -    "KJ|LICENSE_EYE:PRIMARY_SPDX" => license[:license_eye_primary_spdx].to_s,
    -    "KJ|LICENSE_EYE:MODE" => license[:license_eye_mode].to_s,
    -    "KJ|LICENSE_EYE:FLAGS" => license[:license_eye_flags].to_s,
    -    "KJ|LICENSE_EYE:DEPENDENCY_LICENSES" => license[:license_eye_dependency_licenses].to_s,
    -    "KJ|README:LICENSE_BADGE" => license[:readme_license_badge].to_s,
    -    "KJ|README:LICENSE_COMPAT_BADGE" => license[:readme_license_compat_badge].to_s,
    -    "KJ|README:LICENSE_EYE_WORKFLOW_BADGE" => license[:readme_license_eye_workflow_badge].to_s,
    -    "KJ|README:LICENSE_REFS" => license[:readme_license_refs].to_s,
    -    "KJ|LICENSE_COPYRIGHT_NOTICE" => license[:license_copyright_notice].to_s,
    -    "KJ|README:COPYRIGHT_NOTICE" => license[:readme_copyright_notice].to_s,
    -    "KJ|COPYRIGHT_PREFIX" => license[:copyright_prefix].to_s
    -  }
    +def opencollective_org_github_funding_file(project_root)
    +  path = File.join(project_root, ".github", "FUNDING.yml")
    +  return unless File.exist?(path)
    +
    +  funding = YAML.safe_load_file(path, permitted_classes: [], aliases: false) || {}
    +  return unless funding.is_a?(Hash)
    +
    +  org = Array(funding["open_collective"]).map(&:to_s).map(&:strip).reject(&:empty?).first
    +  return unless org
    +
    +  {org: org.delete_prefix("@"), source: ".github/FUNDING.yml"}
     end
    -
    # File 'lib/kettle/jem.rb', line 9736
    +      
    # File 'lib/kettle/jem.rb', line 10198
     
    -def license_use_case_guide_table(licenses, author_email: nil)
    -  has_floss_oss = licenses.include?("MIT") || licenses.include?("AGPL-3.0-only")
    -  has_polyform = licenses.include?("PolyForm-Noncommercial-1.0.0") || licenses.include?("PolyForm-Small-Business-1.0.0")
    -  has_big_time = licenses.include?("LicenseRef-Big-Time-Public-License")
    -  return unless has_floss_oss && has_polyform && has_big_time
    +def opencollective_policy(config, env)
    +  funding = config["funding"]
    +  if funding.is_a?(Hash) && funding.key?("open_collective")
    +    config_value = funding["open_collective"]
    +    return {
    +      disabled: falsey_config?(config_value),
    +      source: "config.funding.open_collective",
    +      value: config_value.to_s
    +    }
    +  end
     
    -  rows = license_use_case_rows(licenses, author_email: author_email)
    -  return if rows.empty?
    +  env_falsey = opencollective_falsey_env(env)
    +  return {disabled: true, source: "env.#{env_falsey.fetch(:key)}", value: env_falsey.fetch(:value).to_s} if env_falsey
     
    -  "| Use case | License |\n|---|---|\n" +
    -    rows.map { |use_case, license| "| #{use_case} | #{license} |" }.join("\n")
    +  template_profile = config.dig("templates", "profile").to_s
    +  if [MONOREPO_SUBGEM_TEMPLATE_PROFILE, "monorepo-subgem"].include?(template_profile)
    +    return {disabled: true, source: "config.templates.profile", value: template_profile}
    +  end
    +
    +  {disabled: false}
     end
    -
    # File 'lib/kettle/jem.rb', line 9749
    +      
    # File 'lib/kettle/jem.rb', line 9845
     
    -def license_use_case_rows(licenses, author_email: nil)
    -  rows = []
    -  rows << ["FLOSS (free and open source)", license_link("MIT")] if licenses.include?("MIT")
    -  rows << ["Copy-left open source", license_link("AGPL-3.0-only")] if licenses.include?("AGPL-3.0-only")
    -  noncommercial_links = %w[PolyForm-Noncommercial-1.0.0 PolyForm-Small-Business-1.0.0 LicenseRef-Big-Time-Public-License]
    -    .select { |license| licenses.include?(license) }
    -    .map { |license| license_link(license) }
    -  rows << ["Non-commercial (research, education, personal use)", noncommercial_links.join(" or ")] unless noncommercial_links.empty?
    -  small_business_links = %w[PolyForm-Small-Business-1.0.0 LicenseRef-Big-Time-Public-License]
    -    .select { |license| licenses.include?(license) }
    -    .map { |license| license_link(license) }
    -  rows << ["Small business commercial", small_business_links.join(" or ")] unless small_business_links.empty?
    -  rows << ["Larger business commercial", large_business_license_cell(author_email)] if licenses.include?("LicenseRef-Big-Time-Public-License")
    -  rows
    +def opt_in_workflow_cleanup_files(project_root, template_selection)
    +  include_patterns = Array(template_selection[:include])
    +  OPT_IN_GITHUB_WORKFLOWS.select do |relative_path|
    +    File.exist?(File.join(project_root, relative_path)) &&
    +      !selected_template_path?(relative_path, include_patterns)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 8592
    +      
    # File 'lib/kettle/jem.rb', line 6040
     
    -def load_project_gemspec(gemspec_path)
    -  Gem::Specification.load(gemspec_path)
    -rescue LoadError, StandardError
    -  nil
    +def outdent_line(line, spaces)
    +  return line if line.strip.empty?
    +
    +  line.delete_prefix(" " * spaces)
     end
    +
    @@ -33452,9 +49740,9 @@

    -

    +

    - .local_gems_assignment(content) ⇒ Object + .package_runtime_dependency_names(facts) ⇒ Object @@ -33466,15 +49754,17 @@

     
     
    -4876
    -4877
    -4878
    +6461 +6462 +6463 +6464

    @@ -33482,9 +49772,9 @@

    -

    +

    - .local_gems_assignment_record(content) ⇒ Object + .packaged_gemfile_template_ruby_floor(target_path) ⇒ Object @@ -33496,41 +49786,25 @@

     
     
    -4891
    -4892
    -4893
    -4894
    -4895
    -4896
    -4897
    -4898
    -4899
    -4900
    -4901
    -4902
    -4903
    -4904
    -4905
    -4906
    +13626 +13627 +13628 +13629 +13630 +13631 +13632 +13633

    @@ -33538,9 +49812,9 @@

    -

    +

    - .managed_license_template_basename(target_path) ⇒ Object + .packaged_template_rootObject @@ -33552,27 +49826,15 @@

     
     
    -10532
    -10533
    -10534
    -10535
    -10536
    -10537
    -10538
    -10539
    -10540
    - -

    + @@ -33580,70 +49842,37 @@

    -

    - - .markdown_heading_has_preserved_readme_ancestor?(heading_sections, index) ⇒ Boolean +

    - + .paired_modular_gemfile_path(local_relative_path) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -4839
    -4840
    -4841
    +6131 +6132 +6133 +6134
    -
    # File 'lib/kettle/jem.rb', line 4839
    +      
    # File 'lib/kettle/jem.rb', line 6131
     
    -def local_gemfile_template_recipe?(recipe)
    -  recipe.fetch(:target_path).to_s.end_with?("_local.gemfile")
    +def outdent_source(source, spaces)
    +  prefix = " " * spaces
    +  source.to_s.lines.map { |line| line.start_with?(prefix) ? line.delete_prefix(prefix) : line }.join
     end
    -
    # File 'lib/kettle/jem.rb', line 4876
    +      
    # File 'lib/kettle/jem.rb', line 6461
     
    -def local_gems_assignment(content)
    -  local_gems_assignment_record(content)&.fetch(:names) || []
    +def package_runtime_dependency_names(facts)
    +  dependencies = facts.to_h.dig(:package, :runtime_dependencies)
    +  Array(dependencies).map(&:to_s).reject(&:empty?).uniq
     end
    -
    # File 'lib/kettle/jem.rb', line 4891
    +      
    # File 'lib/kettle/jem.rb', line 13626
     
    -def local_gems_assignment_record(content)
    -  result = prism_parse_success(content)
    -  return unless result
    -
    -  result.value.breadth_first_search_all do |node|
    -    node.is_a?(::Prism::LocalVariableWriteNode) &&
    -      node.name == :local_gems &&
    -      ruby_word_array_node?(node.value)
    -  end.first&.then do |node|
    -    {
    -      names: ruby_word_array_names(node.value),
    -      start_line: node.location.start_line,
    -      end_line: node.location.end_line
    -    }
    +def packaged_gemfile_template_ruby_floor(target_path)
    +  path = target_path.to_s
    +  if (match = path.match(%r{\Agemfiles/ruby_(\d+)_(\d+)\.gemfile\z}))
    +    return "#{match[1]}.#{match[2]}"
       end
    +
    +  path[%r{(?:\A|/)r(\d+\.\d+)(?:/|\z)}, 1]
     end
    -
    # File 'lib/kettle/jem.rb', line 10532
    -
    -def managed_license_template_basename(target_path)
    -  path = target_path.to_s
    -  return unless path.end_with?(".md")
    -
    -  basename = File.basename(path, ".md")
    -  return if NON_LICENSE_MD_BASENAMES.include?(basename)
    -
    -  known_license_template_basenames.include?(basename) ? basename : nil
    +2116
    +2117
    +2118
    +
    +
    # File 'lib/kettle/jem.rb', line 2116
    +
    +def packaged_template_root
    +  PACKAGED_TEMPLATE_ROOT
     end
    +
    @@ -33651,9 +49880,9 @@

    -

    +

    - .markdown_heading_owners(content, source_label: "README.md") ⇒ Object + .paperclip_ref(name) ⇒ Object @@ -33665,21 +49894,29 @@

     
     
    -4676
    -4677
    -4678
    -4679
    -4680
    -4681
    +12635 +12636 +12637 +12638 +12639 +12640 +12641 +12642 +12643 +12644

    @@ -33687,9 +49924,9 @@

    -

    - .markdown_link_definition_source(owner, url) ⇒ Object + .parse_blame_porcelain(output, author_map) ⇒ Object @@ -33701,19 +49938,69 @@

    @@ -33721,9 +50008,9 @@ @@ -33774,9 +50079,9 @@

    +

    - .markdown_managed_block(content, marker) ⇒ Object + .phase_for_recipe(recipe_name, relative_path) ⇒ Object @@ -33788,33 +50093,41 @@

     
     
    -10094
    -10095
    -10096
    -10097
    -10098
    -10099
    -10100
    -10101
    -10102
    -10103
    -10104
    -10105
    +10120 +10121 +10122 +10123 +10124 +10125 +10126 +10127 +10128 +10129 +10130 +10131 +10132 +10133 +10134 +10135

    @@ -33822,9 +50135,9 @@

    -

    +

    - .markdown_sections(content) ⇒ Object + .phase_reports_for(recipe_reports) ⇒ Object @@ -33836,6 +50149,14 @@

     
     
    +10099
    +10100
    +10101
    +10102
    +10103
    +10104
    +10105
    +10106
     10107
     10108
     10109
    @@ -33843,34 +50164,24 @@ 

    10111 10112 10113 -10114 -10115 -10116 -10117 -10118 -10119 -10120 -10121 -10122 -10123

    +10114

    @@ -33910,9 +50345,9 @@

    -

    +

    - .merge_appraisal_blocks_with_prism(template_block, destination_block) ⇒ Object + .plan_readme_style(project_root, env: ENV) ⇒ Object @@ -33924,37 +50359,57 @@

     
     
    -5857
    -5858
    -5859
    -5860
    -5861
    -5862
    -5863
    -5864
    -5865
    -5866
    -5867
    -5868
    -5869
    -5870
    +4031 +4032 +4033 +4034 +4035 +4036 +4037 +4038 +4039 +4040 +4041 +4042 +4043 +4044 +4045 +4046 +4047 +4048 +4049 +4050 +4051 +4052 +4053 +4054

    @@ -33962,9 +50417,9 @@

    -

    +

    - .merge_appraisals_template_policy(content, facts:) ⇒ Object + .plugin_lifecycle_diagnostic(plugin_registry, callbacks_run:, active_runner_phases:) ⇒ Object @@ -33976,29 +50431,43 @@

     
     
    -5576
    -5577
    -5578
    -5579
    -5580
    -5581
    -5582
    -5583
    -5584
    -5585
    +10017 +10018 +10019 +10020 +10021 +10022 +10023 +10024 +10025 +10026 +10027 +10028 +10029 +10030 +10031 +10032 +10033

    @@ -34006,69 +50475,45 @@

    -

    - - .merge_bash_template_source(template_content, destination_content, recipe) ⇒ Object - - - - +

    -

     
     
    -4561
    -4562
    -4563
    -4564
    -4565
    -4566
    -4567
    -4568
    -4569
    -4570
    -4571
    -4572
    +10983 +10984 +10985 +10986 +10987 +10988 +10989
    -
    # File 'lib/kettle/jem.rb', line 4561
    -
    -def markdown_heading_has_preserved_readme_ancestor?(heading_sections, index)
    -  owner = heading_sections.fetch(index)
    -  ancestor_level = owner.level.to_i
    -  heading_sections[0...index].reverse_each do |candidate|
    -    next unless candidate.level.to_i < ancestor_level
    +      
    # File 'lib/kettle/jem.rb', line 10983
     
    -    return true if README_DEFAULT_PRESERVE_SECTIONS.include?(candidate.base.to_s)
    +def paired_modular_gemfile_path(local_relative_path)
    +  suffix = "_local.gemfile"
    +  path = local_relative_path.to_s
    +  return unless path.end_with?(suffix)
     
    -    ancestor_level = candidate.level.to_i
    -  end
    -  false
    +  "#{path[0...-suffix.length]}.gemfile"
     end
    -
    # File 'lib/kettle/jem.rb', line 4676
    +      
    # File 'lib/kettle/jem.rb', line 12635
     
    -def markdown_heading_owners(content, source_label: "README.md")
    -  context = Ast::Crispr::Markdown::Markly.document_context(content: content.to_s, source_label: source_label)
    -  context.structural_owners(owner_scope: :heading_sections)
    -rescue Ast::Crispr::Error
    -  []
    +def paperclip_ref(name)
    +  {
    +    copyright_notice_explainer: "\u{1F4C4}copyright-notice-explainer",
    +    license: "\u{1F4C4}license",
    +    license_ref: "\u{1F4C4}license-ref",
    +    license_img: "\u{1F4C4}license-img",
    +    license_compat: "\u{1F4C4}license-compat",
    +    license_compat_img: "\u{1F4C4}license-compat-img"
    +  }.fetch(name)
     end
    -
    # File 'lib/kettle/jem.rb', line 4628
    +      
    # File 'lib/kettle/jem.rb', line 10739
     
    -def markdown_link_definition_source(owner, url)
    -  source = "[#{owner.label}]: #{url}"
    -  source = "#{source} #{owner.title.dump}" if owner.title
    -  "#{source}\n"
    +def parse_blame_porcelain(output, author_map)
    +  commit_meta = {}
    +  current_sha = nil
    +  current_name = nil
    +  current_email = nil
    +  current_time = nil
    +  output.to_s.each_line do |raw_line|
    +    line = raw_line.chomp
    +    if line.match?(/\A[0-9a-f]{40}\s/)
    +      current_sha = line[0, 40]
    +      meta = commit_meta[current_sha]
    +      current_name = meta && meta[:name]
    +      current_email = meta && meta[:email]
    +      current_time = meta && meta[:time]
    +    elsif line.start_with?("author ") && !commit_meta.key?(current_sha.to_s)
    +      current_name = line[7..].strip
    +    elsif line.start_with?("author-mail ") && !commit_meta.key?(current_sha.to_s)
    +      current_email = line[12..].strip.gsub(/[<>]/, "")
    +    elsif line.start_with?("author-time ") && !commit_meta.key?(current_sha.to_s)
    +      current_time = line[12..].strip.to_i
    +    elsif line.start_with?("filename ")
    +      next unless current_sha && current_email
    +
    +      commit_meta[current_sha] ||= {name: current_name, email: current_email, time: current_time}
    +      year = current_time&.positive? ? Time.at(current_time).utc.year.to_s : Time.now.utc.year.to_s
    +      author_map[current_email][:name] ||= current_name
    +      author_map[current_email][:years] << year
    +    end
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 3750
    +      
    # File 'lib/kettle/jem.rb', line 3501
     
    -def markdown_link_reference_definition_line?(line)
    -  line.to_s.lstrip.start_with?("[") && line.to_s.include?("]:")
    +def parse_event_types(types)
    +  tokens = Array(types).flat_map { |value| value.to_s.split(",") }.map(&:strip).reject(&:empty?)
    +  tokens = ["default"] if tokens.empty?
    +  expanded = tokens.flat_map do |token|
    +    normalized = token.tr("-", "_")
    +    EVENT_TYPE_ALIASES.fetch(normalized, normalized)
    +  end.uniq
    +  unknown = expanded - EVENT_TYPES
    +  raise ArgumentError, "Unknown event type(s): #{unknown.join(", ")}. Supported event types: #{EVENT_TYPES.join(", ")}" unless unknown.empty?
    +
    +  expanded
     end
    -
    # File 'lib/kettle/jem.rb', line 10094
    +      
    # File 'lib/kettle/jem.rb', line 10120
     
    -def markdown_managed_block(content, marker)
    -  open = "<!-- #{marker}:start -->"
    -  close = "<!-- #{marker}:end -->"
    -  context = Ast::Crispr::Markdown::Markly.document_context(content: content.to_s, source_label: "managed markdown block")
    -  target = Ast::Crispr::Markdown::Markly::Selectors.html_comment_block(
    -    start_text: open.delete_prefix("<!-- ").delete_suffix(" -->"),
    -    end_text: close.delete_prefix("<!-- ").delete_suffix(" -->"),
    -    span: :outermost,
    -    limit: {none_or_one: true}
    -  )
    -  target.locate_matches(context).first&.slice_from(content.to_s)
    +def phase_for_recipe(recipe_name, relative_path)
    +  path = relative_path.to_s
    +  name = recipe_name.to_s
    +  return :config_sync if path == KETTLE_CONFIG_PATH || path == LEGACY_KETTLE_CONFIG_PATH || name.include?("kettle_config")
    +  return :dev_container if path.start_with?(".devcontainer/")
    +  return :github_workflows if path.start_with?(".github/workflows/") || path == ".github/FUNDING.yml"
    +  return :modular_gemfiles if path.start_with?("gemfiles/modular/")
    +  return :spec_helper if path == "spec/spec_helper.rb" || path.start_with?("spec/support/")
    +  return :environment_templates if path.start_with?(".env") || path.end_with?(".env")
    +  return :git_hooks if path.start_with?(".git/hooks/", "git-hooks/")
    +  return :license_files if path.start_with?("LICENSE", "NOTICE") || managed_license_template_basename(path)
    +  return :duplicate_check if name.include?("duplicate")
    +  return :quality_config if quality_config_path?(path)
    +
    +  :remaining_files
     end
    -
    # File 'lib/kettle/jem.rb', line 10107
    +      
    # File 'lib/kettle/jem.rb', line 10099
     
    -def markdown_sections(content)
    -  lines = content.to_s.split("\n", -1)
    -  markdown_heading_owners(content, source_label: "README.md").map do |owner|
    -    start = owner.location.start_line - 1
    -    branch_end = owner.location.end_line - 1
    -    body = (lines[(start + 1)..branch_end] || []).join("\n")
    +def phase_reports_for(recipe_reports)
    +  reports_by_phase = recipe_reports.group_by { |recipe_report| recipe_report_phase(recipe_report) }
    +  PHASE_ORDER.map do |phase|
    +    reports = reports_by_phase.fetch(phase, [])
    +    changed_reports = reports.select { |recipe_report| recipe_report[:changed] }
         {
    -      start: start,
    -      level: owner.level,
    -      heading: owner.heading_source,
    -      heading_text: owner.heading_text,
    -      base: owner.base,
    -      end: branch_end,
    -      body: body
    +      phase: phase.to_s,
    +      recipes: reports.map { |recipe_report| recipe_report[:recipe_name] }.compact,
    +      changed_files: changed_reports.map { |recipe_report| recipe_report[:relative_path] }.compact.uniq.sort,
    +      stats: {
    +        recipe_count: reports.length,
    +        changed_count: changed_reports.length
    +      }
         }
       end
     end
    @@ -33880,9 +50191,9 @@

    -

    +

    - .markdown_source_lines(content) ⇒ Object + .plan_project(project_root, env: ENV, run_options: {}) ⇒ Object @@ -33894,15 +50205,139 @@

     
     
    -3716
    -3717
    -3718
    +3391 +3392 +3393 +3394 +3395 +3396 +3397 +3398 +3399 +3400 +3401 +3402 +3403 +3404 +3405 +3406 +3407 +3408 +3409 +3410 +3411 +3412 +3413 +3414 +3415 +3416 +3417 +3418 +3419 +3420 +3421 +3422 +3423 +3424 +3425 +3426 +3427 +3428 +3429 +3430 +3431 +3432 +3433 +3434 +3435 +3436 +3437 +3438 +3439 +3440 +3441 +3442 +3443 +3444 +3445 +3446 +3447 +3448 +3449 +3450 +3451 +3452 +3453 +3454 +3455

    -
    # File 'lib/kettle/jem.rb', line 3716
    +      
    # File 'lib/kettle/jem.rb', line 3391
     
    -def markdown_source_lines(content)
    -  content.to_s.split("\n")
    +def plan_project(project_root, env: ENV, run_options: {})
    +  events = event_stream_from_options(run_options)
    +  emit_event(events, "run_start", mode: "plan", project_root: project_root.to_s)
    +  with_event_phase(events, "runtime_dependencies") { ensure_runtime_dependencies! }
    +  with_event_phase(events, "preflight") { preflight_project!(project_root) }
    +  template_selection = with_event_phase(events, "template_selection") { template_selection_for(env, run_options) }
    +  decision_policy = with_event_phase(events, "decision_policy") { decision_policy_for(env, run_options) }
    +  git_preflight = with_event_phase(events, "git_preflight") do
    +    git_preflight_report(project_root, template_selection: template_selection)
    +  end
    +  with_event_phase(events, "git_preflight_enforcement") do
    +    enforce_git_preflight!(git_preflight, decision_policy: decision_policy, template_selection: template_selection)
    +  end
    +  facts = with_event_phase(events, "facts") { discover_facts(project_root, env: env, run_options: run_options) }
    +  pack = with_event_phase(events, "recipe_pack") { recipe_pack(facts) }
    +  pack = with_event_phase(events, "recipe_filter") { filter_recipe_pack(pack, template_selection) }
    +  files = with_event_phase(events, "read_project_files") { read_project_files(project_root, pack) }
    +  recipes = pack.fetch(:recipes)
    +  recipe_reports = with_event_phase(events, "recipes", total: recipes.length) do
    +    recipes.each_with_index.map do |recipe, index|
    +      report = execute_recipe(project_root: project_root, recipe: recipe, facts: facts, files: files, decision_policy: decision_policy, env: env)
    +      emit_recipe_event(events, report, index: index, total: recipes.length)
    +      report
    +    end
    +  end
    +  plugin_registry = with_event_phase(events, "plugins") { plugin_registry_for_project(project_root) }
    +  changed_files = changed_files_from_recipe_reports(recipe_reports)
    +  diagnostics = recipe_reports.flat_map { |report| report[:diagnostics] }
    +  phase_reports = phase_reports_for(recipe_reports)
    +  decision_evaluations = recipe_reports.map { |report| report.fetch(:decision_evaluation) }
    +  prompt_requests = decision_evaluations.filter_map { |decision| decision[:prompt] if decision[:prompt_required] }
    +  unless plugin_registry.configured_plugins.empty?
    +    diagnostics << plugin_lifecycle_diagnostic(
    +      plugin_registry,
    +      callbacks_run: false,
    +      active_runner_phases: []
    +    )
    +  end
    +  emit_diagnostic_events(events, diagnostics)
    +  run_stats = recipe_run_stats(recipe_reports, diagnostics: diagnostics)
    +  warnings = Array(facts[:warnings]).map(&:to_s).reject(&:empty?)
    +  warnings.concat(github_workflow_template_pin_warnings(recipe_reports))
    +
    +  report = with_event_phase(events, "report") do
    +    {
    +      mode: "plan",
    +      ready: true,
    +      facts: facts,
    +      recipe_pack: pack,
    +      recipe_reports: recipe_reports,
    +      phase_reports: phase_reports,
    +      decision_policy: decision_policy.to_h,
    +      template_selection: template_selection,
    +      git_preflight: git_preflight,
    +      decision_evaluations: decision_evaluations,
    +      prompt_requests: prompt_requests,
    +      changed_files: changed_files,
    +      warnings: warnings.uniq,
    +      diagnostics: diagnostics,
    +      run_stats: run_stats
    +    }
    +  end
    +  emit_summary_event(events, report)
    +  report
     end
    -
    # File 'lib/kettle/jem.rb', line 5857
    +      
    # File 'lib/kettle/jem.rb', line 4031
     
    -def merge_appraisal_blocks_with_prism(template_block, destination_block)
    -  result = Prism::Merge.merge_ruby(
    -    template_block,
    -    destination_block,
    -    "ruby",
    -    preference: :destination,
    -    add_template_only_nodes: true,
    -    signature_generator: Prism::Merge.ruby_dsl_signature_generator,
    -    method_move_policy: ruby_method_move_policy({}),
    -    merge_template_requires: true,
    -    template_only_placement: :after_anchor
    -  )
    -  result[:ok] ? result.fetch(:output) : template_block
    +def plan_readme_style(project_root, env: ENV)
    +  facts = discover_facts(project_root, env: env)
    +  config = kettle_jem_config(project_root)
    +  readme_style = facts[:readme_style] ||
    +    readme_style_facts(
    +      project_root,
    +      config,
    +      facts.fetch(:license, {}),
    +      template_profile: facts[:template_profile],
    +      repository: facts[:repository]
    +    )
    +  original_path = File.join(project_root, "README.md")
    +  original = File.exist?(original_path) ? File.read(original_path) : ""
    +  final_content = render_thin_readme(facts, readme_style, original, readme_preserve_config(config))
    +
    +  {
    +    mode: "plan",
    +    readme_path: "README.md",
    +    changed: final_content != original,
    +    readme_style: readme_style,
    +    final_content: final_content,
    +    diagnostics: []
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 5576
    +      
    # File 'lib/kettle/jem.rb', line 10017
     
    -def merge_appraisals_template_policy(content, facts:)
    -  package_name = facts.dig(:package, :name).to_s if facts
    -  min_ruby = minimum_ruby_token(facts.dig(:ci, :test_min_ruby) || facts.dig(:rubygems, :min_ruby)) if facts
    -  with_framework_appraisals = merge_framework_matrix_appraisals(content, facts)
    -  with_standard_appraisal_gemfiles = inject_standard_appraisal_gemfiles(with_framework_appraisals, facts)
    -  pruned = prune_appraisals_recording_entries(with_standard_appraisal_gemfiles, facts)
    -  pruned = prune_appraisals_below_min_ruby(pruned, min_ruby)
    -  pruned = remove_gemfile_dependency_lines(pruned, [package_name])
    -  remove_gemfile_percent_w_entries(pruned, [package_name])
    +def plugin_lifecycle_diagnostic(plugin_registry, callbacks_run:, active_runner_phases:)
    +  {
    +    kind: "plugin_lifecycle",
    +    configured_plugins: plugin_registry.configured_plugins,
    +    loaded_plugins: plugin_registry.loaded_plugins,
    +    load_errors: plugin_registry.load_errors,
    +    registered_hooks: plugin_registry.hooks.map do |hook|
    +      {
    +        plugin_name: hook.plugin_name,
    +        phase: hook.phase.to_s,
    +        timing: hook.timing.to_s
    +      }
    +    end,
    +    callbacks_run: callbacks_run,
    +    active_runner_phases: active_runner_phases.map(&:to_s)
    +  }
     end
    - - @@ -37588,9 +54017,9 @@

    -

    +

    - .plan_readme_style(project_root, env: ENV) ⇒ Object + .readme_destination_front_sections(destination_content) ⇒ Object @@ -37602,57 +54031,35 @@

     
     
    -3456
    -3457
    -3458
    -3459
    -3460
    -3461
    -3462
    -3463
    -3464
    -3465
    -3466
    -3467
    -3468
    -3469
    -3470
    -3471
    -3472
    -3473
    -3474
    -3475
    -3476
    -3477
    -3478
    -3479
    +12938 +12939 +12940 +12941 +12942 +12943 +12944 +12945 +12946 +12947 +12948 +12949 +12950

    @@ -37660,9 +54067,9 @@

    -

    +

    - .plugin_lifecycle_diagnostic(plugin_registry, callbacks_run:, active_runner_phases:) ⇒ Object + .readme_dev_test_stack_table(package_name) ⇒ Object @@ -37674,43 +54081,103 @@

     
     
    -7677
    -7678
    -7679
    -7680
    -7681
    -7682
    -7683
    -7684
    -7685
    -7686
    -7687
    -7688
    -7689
    -7690
    -7691
    -7692
    -7693
    +10366 +10367 +10368 +10369 +10370 +10371 +10372 +10373 +10374 +10375 +10376 +10377 +10378 +10379 +10380 +10381 +10382 +10383 +10384 +10385 +10386 +10387 +10388 +10389

    + +
    -
    -
    -
    -5833
    -5834
    -5835
    -5836
    -5837
    -5838
    -5839
    -5840
    -5841
    -5842
    -5843
    -5844
    -5845
    -5846
    -5847
    -5848
    -5849
    -5850
    -5851
    -5852
    -5853
    -5854
    -5855
    + .plugin_names_from_config(config) ⇒ Object + + + + + + + + @@ -34076,9 +50521,9 @@

    -

    +

    - .merge_changelog_template_source(template_content, destination_content) ⇒ Object + .plugin_registry_for_project(project_root) ⇒ Object @@ -34090,65 +50535,37 @@

     
     
    -3687
    -3688
    -3689
    -3690
    -3691
    -3692
    -3693
    -3694
    -3695
    -3696
    -3697
    -3698
    -3699
    -3700
    -3701
    -3702
    -3703
    -3704
    -3705
    -3706
    -3707
    -3708
    -3709
    -3710
    -3711
    -3712
    -3713
    -3714
    +9990 +9991 +9992 +9993 +9994 +9995 +9996 +9997 +9998 +9999 +10000 +10001 +10002 +10003

    @@ -34156,9 +50573,9 @@

    -

    +

    - .merge_config_template_source(recipe, template_content, destination_content, facts: nil, env: ENV) ⇒ Object + .polyform_licenses?(licenses) ⇒ Boolean @@ -34173,13 +50590,13 @@

    -

    Raises:

    -
      +

      Returns:

      +
      • - (ArgumentError) + (Boolean) @@ -34193,145 +50610,57 @@

         
         
        -4757
        -4758
        -4759
        -4760
        -4761
        -4762
        -4763
        -4764
        -4765
        -4766
        -4767
        -4768
        -4769
        -4770
        -4771
        -4772
        -4773
        -4774
        -4775
        -4776
        -4777
        -4778
        -4779
        -4780
        -4781
        -4782
        -4783
        -4784
        -4785
        -4786
        -4787
        -4788
        -4789
        -4790
        -4791
        -4792
        -4793
        -4794
        -4795
        -4796
        -4797
        -4798
        -4799
        -4800
        -4801
        -4802
        -4803
        -4804
        -4805
        -4806
        -4807
        -4808
        -4809
        -4810
        -4811
        -4812
        -4813
        -4814
        -4815
        -4816
        -4817
        -4818
        -4819
        -4820
        -4821
        -4822
        -4823
        -4824
        +12589 +12590 +12591

    + +
    +
    +
    +
    +10005
    +10006
    +10007
    +10008
    +10009
    +10010
    +10011
    +10012
    +10013
    +10014
    +10015
    -
    # File 'lib/kettle/jem.rb', line 5833
    +      
    # File 'lib/kettle/jem.rb', line 10005
     
    -def merge_bash_template_source(template_content, destination_content, recipe)
    -  availability = Bash::Merge.availability(source: template_content.to_s)
    -  unless availability.available?
    -    return {
    -      ok: false,
    -      output: destination_content,
    -      diagnostics: [{
    -        kind: "bash_merge_unavailable",
    -        message: "bash structural merge is unavailable because TreeHaver node parser support for Bash is not available",
    -        details: availability.diagnostics
    -      }]
    -    }
    +def plugin_names_from_config(config)
    +  raw = config.is_a?(Hash) ? config["plugins"] : nil
    +  case raw
    +  when Hash
    +    raw.each_with_object([]) do |(name, enabled), names|
    +      names << name unless falsey_config?(enabled)
    +    end
    +  else
    +    raw
       end
    -
    -  output = Bash::Merge::SmartMerger.new(
    -    template_content,
    -    destination_content,
    -    **bash_merge_options(recipe)
    -  ).merge
    -  {ok: true, output: output, diagnostics: []}
    -rescue Bash::Merge::Error => e
    -  {ok: false, output: destination_content, diagnostics: [{kind: "bash_merge_failed", message: e.message}]}
     end
    -
    # File 'lib/kettle/jem.rb', line 3687
    -
    -def merge_changelog_template_source(template_content, destination_content)
    -  destination = destination_content.to_s
    -  return ensure_trailing_newline(template_content.to_s) if destination.strip.empty?
    -
    -  template_lines = markdown_source_lines(template_content)
    -  template_unreleased = changelog_unreleased_line_index(template_lines)
    -  return ensure_trailing_newline(template_content.to_s) unless template_unreleased
    +      
    # File 'lib/kettle/jem.rb', line 9990
     
    -  destination_lines = markdown_source_lines(destination)
    -  destination_unreleased = changelog_unreleased_line_index(destination_lines)
    -  unless destination_unreleased
    -    header = changelog_template_header(template_lines, template_unreleased).join("\n")
    -    return ensure_trailing_newline("#{header}\n\n#{destination}")
    +def plugin_registry_for_project(project_root)
    +  plugin_names = PluginLoader.normalize_plugin_names(plugin_names_from_config(kettle_jem_config(project_root)))
    +  registry = PluginRegistry.new(configured_plugins: plugin_names)
    +  plugin_names.each do |plugin_name|
    +    PluginLoader.load_plugin!(plugin_name, registry: registry)
    +    registry.loaded_plugins << plugin_name
    +  rescue Error => e
    +    registry.load_errors << {
    +      plugin_name: plugin_name,
    +      message: e.message
    +    }
       end
    -
    -  destination_end = changelog_unreleased_end_index(destination_lines, destination_unreleased)
    -  destination_body = destination_lines[(destination_unreleased + 1)...destination_end] || []
    -  canonical = build_changelog_unreleased_section(
    -    template_lines.fetch(template_unreleased),
    -    changelog_unreleased_items(destination_body)
    -  )
    -  header = changelog_template_header(template_lines, template_unreleased)
    -  merged_lines = header +
    -    (header.empty? ? [] : [""]) +
    -    canonical +
    -    destination_lines[destination_end..].to_a
    -  ensure_trailing_newline(merged_lines.join("\n").gsub(/\n{3,}/, "\n\n"))
    +  registry
     end
    -
    # File 'lib/kettle/jem.rb', line 4757
    -
    -def merge_config_template_source(recipe, template_content, destination_content, facts: nil, env: ENV)
    -  file_type = template_file_type(recipe)
    -  if destination_content.to_s.strip.empty?
    -    if file_type == :gemfile
    -      return finalize_gemfile_template_source(recipe, template_content, destination_content, facts: facts, template_content: template_content)
    -    end
    -    return merge_appraisals_template_policy(template_content, facts: facts) if file_type == :appraisals
    -    return finalize_github_workflow_template(prune_github_workflow_matrix_by_min_ruby(template_content, facts), facts) if github_workflow_template_recipe?(recipe)
    -
    -    return template_content
    -  end
    -  if destination_content == template_content
    -    if file_type == :gemfile
    -      return finalize_gemfile_template_source(recipe, destination_content, destination_content, facts: facts, template_content: template_content)
    -    end
    -    return merge_appraisals_template_policy(destination_content, facts: facts) if file_type == :appraisals
    +      
    # File 'lib/kettle/jem.rb', line 12589
     
    -    return destination_content
    -  end
    +def polyform_licenses?(licenses)
    +  licenses.any? { |license| license.to_s.start_with?("PolyForm-") }
    +end
    +
    + + +
    +

    + + .post_apply_steps(project_root, report) ⇒ Object + - case file_type - when :gemspec - return merge_gemspec_template_source(template_content, destination_content, facts: facts, env: env) - when :ruby, :gemfile, :rakefile, :appraisals - merge_result = merge_ruby_template_source(file_type, recipe, template_content, destination_content, facts: facts) - when :yaml - merge_result = Psych::Merge.merge_yaml( - template_content, - destination_content, - "yaml", - **yaml_merge_options(recipe) - ) - when :toml - merge_result = Toml::Merge.merge_toml(template_content, destination_content, "toml") - when :json, :jsonc - merge_result = merge_json_template_source(template_content, destination_content, recipe, file_type) - when :markdown - return merge_changelog_template_source(template_content, destination_content) if recipe.fetch(:target_path) == "CHANGELOG.md" + - return template_content - when :dotenv - merge_result = merge_dotenv_template_source(template_content, destination_content, recipe) - when :rbs - merge_result = merge_rbs_template_source(template_content, destination_content, recipe) - when :bash - merge_result = merge_bash_template_source(template_content, destination_content, recipe) - else - return template_content - end - if merge_result[:ok] - output = merge_result.fetch(:output) - if file_type == :gemfile - output = merge_gemfile_eval_bucket_entries(template_content, output) - return finalize_gemfile_template_source(recipe, output, destination_content, facts: facts, template_content: template_content) - end - return merge_appraisals_template_policy(output, facts: facts) if file_type == :appraisals + +

    + + + @@ -34339,9 +50668,9 @@

    -

    +

    - .merge_dotenv_template_source(template_content, destination_content, recipe) ⇒ Object + .postprocess_readme_content(content, facts, project_root: nil) ⇒ Object @@ -34353,29 +50682,47 @@

     
     
    -5785
    -5786
    -5787
    -5788
    -5789
    -5790
    -5791
    -5792
    -5793
    -5794
    +5083 +5084 +5085 +5086 +5087 +5088 +5089 +5090 +5091 +5092 +5093 +5094 +5095 +5096 +5097 +5098 +5099 +5100 +5101

    @@ -34383,9 +50730,9 @@

    -

    +

    - .merge_framework_matrix_appraisals(content, facts) ⇒ Object + .preferred_template_source(template_root, configured_source, opencollective_disabled: false) ⇒ Object @@ -34397,63 +50744,25 @@

     
     
    -5692
    -5693
    -5694
    -5695
    -5696
    -5697
    -5698
    -5699
    -5700
    -5701
    -5702
    -5703
    -5704
    -5705
    -5706
    -5707
    -5708
    -5709
    -5710
    -5711
    -5712
    -5713
    -5714
    -5715
    -5716
    -5717
    -5718
    +13687 +13688 +13689 +13690 +13691 +13692 +13693 +13694

    @@ -34461,9 +50770,9 @@

    -

    +

    - .merge_gemfile_eval_bucket_entries(template_content, merged_content) ⇒ Object + .preferred_template_token_value(derived_value, config_value, env, env_key) ⇒ Object @@ -34475,85 +50784,65 @@

     
     
    -5500
    -5501
    -5502
    -5503
    -5504
    -5505
    -5506
    -5507
    -5508
    -5509
    -5510
    -5511
    -5512
    -5513
    -5514
    -5515
    -5516
    -5517
    -5518
    -5519
    -5520
    -5521
    -5522
    -5523
    -5524
    -5525
    -5526
    -5527
    -5528
    -5529
    -5530
    -5531
    -5532
    -5533
    -5534
    -5535
    -5536
    -5537
    +10634 +10635 +10636 +10637 +10638 +10639 +10640 +10641 +10642 +10643

    + +
    +
     
    -    output = finalize_github_workflow_template(prune_github_workflow_matrix_by_min_ruby(output, facts), facts) if github_workflow_template_recipe?(recipe)
    -    return output
    -  end
     
    -  return fallback_adapter_failure_template_source(file_type, recipe, template_content, destination_content, facts) if process_result_adapter_failure?(merge_result)
    -  return template_content if github_workflow_template_recipe?(recipe)
    +3660
    +3661
    +3662
    +3663
    +3664
    +3665
    +3666
    +3667
    +3668
    +
    +
    # File 'lib/kettle/jem.rb', line 3660
     
    -  diagnostics = merge_result.fetch(:diagnostics, [])
    -  message = diagnostics.map { |diagnostic| diagnostic[:message] || diagnostic["message"] }.compact.join("; ")
    -  raise ArgumentError, "failed to merge #{file_type} template #{recipe.fetch(:target_path)}: #{message}"
    +def post_apply_steps(project_root, report)
    +  [
    +    template_version_gem_bootstrap_step(project_root, report),
    +    monorepo_root_gemfile_dependency_sync_step(project_root, report),
    +    git_hooks_executable_step(project_root),
    +    github_actions_pin_sync_step(project_root),
    +    monorepo_subgem_kettle_config_profile_sync_step(project_root, report)
    +  ].compact
     end
    -
    # File 'lib/kettle/jem.rb', line 5785
    +      
    # File 'lib/kettle/jem.rb', line 5083
     
    -def merge_dotenv_template_source(template_content, destination_content, recipe)
    -  output = Dotenv::Merge::SmartMerger.new(
    -    template_content,
    -    destination_content,
    -    **dotenv_merge_options(recipe)
    -  ).merge
    -  {ok: true, output: output, diagnostics: []}
    -rescue Dotenv::Merge::Error => e
    -  {ok: false, output: destination_content, diagnostics: [{kind: "dotenv_merge_failed", message: e.message}]}
    +def postprocess_readme_content(content, facts, project_root: nil)
    +  return content unless facts
    +
    +  processed = ReadmePostProcessor.process(
    +    content: content,
    +    min_ruby: minimum_ruby_token(facts.dig(:rubygems, :min_ruby)),
    +    engines: facts.dig(:rubygems, :engines)
    +  )
    +  processed = normalize_readme_project_heading(processed, facts)
    +  processed = normalize_readme_synopsis_heading(processed, facts)
    +  processed = apply_readme_conditional_blocks(processed, facts)
    +  processed = apply_readme_badge_policy(processed, facts)
    +  processed = prune_unused_readme_logo_link_definitions(processed)
    +  processed = apply_readme_kloc_badge(processed, facts, project_root)
    +  processed = apply_monorepo_subgem_thin_readme_projection(processed, facts)
    +  processed = apply_monorepo_subgem_readme_recipe(processed, facts)
    +  processed = replace_existing_markdown_managed_block(processed, "kettle-jem:metadata", (facts))
    +  normalize_readme_blank_line_runs(processed)
     end
    -
    # File 'lib/kettle/jem.rb', line 5692
    -
    -def merge_framework_matrix_appraisals(content, facts)
    -  entries = facts.to_h.dig(:ci, :framework_matrix, :appraisals).to_a
    -  return content if entries.empty?
    -
    -  generated = entries.to_h do |entry|
    -    [entry.fetch(:name).to_s, framework_matrix_appraisal_block(entry)]
    -  end
    -  replaced = entries.flat_map { |entry| entry.fetch(:replaces, []) }.map(&:to_s).to_set
    -  parsed = appraisal_blocks(content)
    -  emitted = Set.new
    -  blocks = parsed.fetch(:order).map do |name|
    -    next if replaced.include?(name) && !generated.key?(name)
    -
    -    emitted << name
    -    parsed_block = parsed.fetch(:blocks).fetch(name).rstrip
    -    generated_block = generated[name]
    -    generated_block ? merge_appraisal_blocks_with_prism(generated_block, parsed_block) : parsed_block
    -  end.compact
    -  entries.each do |entry|
    -    name = entry.fetch(:name).to_s
    -    next if emitted.include?(name)
    -
    -    blocks << generated.fetch(name)
    -  end
    +      
    # File 'lib/kettle/jem.rb', line 13687
     
    -  ensure_trailing_newline(([parsed.fetch(:prelude).to_s.rstrip] + blocks).reject(&:empty?).join("\n\n"))
    +def preferred_template_source(template_root, configured_source, opencollective_disabled: false)
    +  base = configured_source.sub(/\.example\z/, "")
    +  candidates = []
    +  candidates << "#{base}.no-osc.example" if opencollective_disabled && base != "README.md"
    +  candidates << "#{base}.example"
    +  candidates << configured_source
    +  candidates.find { |relative_path| File.exist?(File.join(template_root, relative_path)) }
     end
    -
    # File 'lib/kettle/jem.rb', line 5500
    +      
    # File 'lib/kettle/jem.rb', line 10634
     
    -def merge_gemfile_eval_bucket_entries(template_content, merged_content)
    -  template_entries = gemfile_eval_bucket_entries(template_content)
    -  return merged_content if template_entries.empty?
    +def preferred_template_token_value(derived_value, config_value, env, env_key)
    +  env_clean = env[env_key].to_s.strip
    +  return env_clean if present_template_token_value?(env_clean)
     
    -  template_by_key = template_entries.to_h { |entry| [entry.fetch(:key), entry] }
    -  emitted_paths = Set.new
    -  insert_at = nil
    -  lines = []
    -  merged_lines = merged_content.to_s.lines
    -   = gemfile_eval_bucket_entries(merged_content).to_h { |entry| [entry.fetch(:start_line), entry] }
    -  skip_until = 0
    -  merged_lines.each_with_index do |line, index|
    -    line_number = index + 1
    -    next if line_number < skip_until
    +  config_clean = config_value.to_s.strip
    +  return config_clean if present_template_token_value?(config_clean)
    +  return unless present_template_token_value?(derived_value)
     
    -    entry = [line_number]
    -    unless entry && template_by_key.key?(entry.fetch(:key))
    -      lines << line
    -      next
    -    end
    +  derived_value.to_s.strip
    +end
    +
    +
    + +
    +

    + + .preflight_project!(project_root) ⇒ Object + - template_entry = template_by_key.fetch(entry.fetch(:key)) - if entry.fetch(:path) == template_entry.fetch(:path) - lines << entry.fetch(:line) unless emitted_paths.include?(entry.fetch(:path)) - emitted_paths << entry.fetch(:path) - else - insert_at ||= lines.length - end - skip_until = entry.fetch(:end_line) + 1 - end + - missing_lines = template_entries.reject { |entry| emitted_paths.include?(entry.fetch(:path)) }.map { |entry| entry.fetch(:line) } - return ensure_trailing_newline(lines.join) if missing_lines.empty? + +

    + + + @@ -34561,9 +50850,9 @@

    -

    +

    - .merge_gemfile_template_policy(content, facts:, template_content: nil, preserve_self_word_entries: false) ⇒ Object + .preflight_ruby_syntax!(project_root, path) ⇒ Object @@ -34575,39 +50864,31 @@

     
     
    -5156
    -5157
    -5158
    -5159
    -5160
    -5161
    -5162
    -5163
    -5164
    -5165
    -5166
    -5167
    -5168
    -5169
    -5170
    +9917 +9918 +9919 +9920 +9921 +9922 +9923 +9924 +9925 +9926 +9927

    @@ -34615,9 +50896,9 @@

    -

    +

    - .merge_gemspec_template_source(template_content, destination_content, facts: nil, env: ENV) ⇒ Object + .prepare_github_workflow_template(content, recipe, facts) ⇒ Object @@ -34629,63 +50910,21 @@

     
     
    -5932
    -5933
    -5934
    -5935
    -5936
    -5937
    -5938
    -5939
    -5940
    -5941
    -5942
    -5943
    -5944
    -5945
    -5946
    -5947
    -5948
    -5949
    -5950
    -5951
    -5952
    -5953
    -5954
    -5955
    -5956
    -5957
    -5958
    +5048 +5049 +5050 +5051 +5052 +5053

    @@ -34693,9 +50932,9 @@

    -

    +

    - .merge_json_template_source(template_content, destination_content, recipe, file_type) ⇒ Object + .prepare_readme_template(content, readme_style) ⇒ Object @@ -34707,29 +50946,43 @@

     
     
    -5761
    -5762
    -5763
    -5764
    -5765
    -5766
    -5767
    -5768
    -5769
    -5770
    +5398 +5399 +5400 +5401 +5402 +5403 +5404 +5405 +5406 +5407 +5408 +5409 +5410 +5411 +5412 +5413 +5414

    @@ -34737,47 +50990,54 @@

    -

    +

    - .merge_local_gem_overrides(content, destination_content, facts:, template_content: nil) ⇒ Object + .present_template_token_value?(value) ⇒ Boolean -

    +
     
    -  insert_at ||= lines.length
    -  lines[insert_at, 0] = missing_lines
    -  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
    +
    +9881
    +9882
    +9883
    +9884
    +9885
    +9886
    +
    +
    # File 'lib/kettle/jem.rb', line 9881
    +
    +def preflight_project!(project_root)
    +  paths = Dir.glob(File.join(project_root, "*.gemspec")).sort
    +  gemfile_path = File.join(project_root, "Gemfile")
    +  paths << gemfile_path if File.exist?(gemfile_path)
    +  paths.each { |path| preflight_ruby_syntax!(project_root, path) }
     end
    -
    # File 'lib/kettle/jem.rb', line 5156
    +      
    # File 'lib/kettle/jem.rb', line 9917
     
    -def merge_gemfile_template_policy(content, facts:, template_content: nil, preserve_self_word_entries: false)
    -  package_name = facts.dig(:package, :name).to_s if facts
    -  removable_gems = ["appraisal"]
    -  removable_gems << package_name unless package_name.to_s.empty?
    -  removable_gems << "version_gem" unless version_gem_runtime_compatible?(facts)
    -  pruned = remove_gemfile_dependency_blocks(content, removable_gems)
    -  pruned = remove_gemfile_percent_w_entries(pruned, [package_name]) unless preserve_self_word_entries
    -  pruned = merge_template_gemfile_dependency_blocks(
    -    template_content,
    -    pruned,
    -    removable_gems,
    -    preserve_self_word_entries: preserve_self_word_entries
    -  )
    -  apply_commented_gem_dependency_policy(template_content, pruned)
    +def preflight_ruby_syntax!(project_root, path)
    +  if defined?(RubyVM::InstructionSequence)
    +    RubyVM::InstructionSequence.compile_file(path)
    +  else
    +    _stdout, stderr, status = Open3.capture3(RbConfig.ruby, "-c", path)
    +    raise SyntaxError, stderr unless status.success?
    +  end
    +rescue SyntaxError => e
    +  relative_path = path.delete_prefix("#{project_root}/")
    +  raise Error, "Preflight failed for #{relative_path}: #{e.message}"
     end
    -
    # File 'lib/kettle/jem.rb', line 5932
    +      
    # File 'lib/kettle/jem.rb', line 5048
     
    -def merge_gemspec_template_source(template_content, destination_content, facts: nil, env: ENV)
    -  template_receiver = gemspec_block_param(template_content) || "spec"
    -  destination_receiver = gemspec_block_param(destination_content) || "spec"
    -  package_name = facts.dig(:package, :name).to_s if facts
    -  replacements = gemspec_preserved_assignments(destination_content, receiver: destination_receiver)
    -    .except(*env_overridden_gemspec_fields(env))
    -  normalized_replacements = replacements.to_h do |field, source|
    -    replacement = normalize_gemspec_receiver(source.rstrip, from: destination_receiver, to: template_receiver)
    -    [field, normalize_gemspec_project_emoji(replacement, facts, field: field)]
    -  end
    -  merged = replace_gemspec_assignment_sources(template_content, normalized_replacements, receiver: template_receiver)
    -  merged = preserve_gemspec_dependency_lines(
    -    merged,
    -    destination_content,
    -    template_receiver: template_receiver,
    -    destination_receiver: destination_receiver
    -  )
    -  merged = preserve_gemspec_freeze_blocks(merged, destination_content, facts: facts, receiver: template_receiver)
    -  merged = apply_configured_gemspec_licenses(merged, facts, receiver: template_receiver)
    -  merged = apply_configured_gemspec_required_ruby_version(merged, facts, receiver: template_receiver)
    -  merged = remove_duplicate_gemspec_assignments(merged, receiver: template_receiver, fields: %w[homepage])
    -  merged = remove_gemspec_self_dependency_lines(merged, package_name, receiver: template_receiver)
    -  merged = remove_gemspec_version_gem_dependency_when_runtime_incompatible(merged, facts, receiver: template_receiver)
    -  merged = remove_gemspec_development_dependencies_already_runtime(merged, receiver: template_receiver)
    -  merged = sort_runtime_gemspec_dependency_lines(merged, receiver: template_receiver)
    -  rewrite_gemspec_version_loader(merged, facts: facts)
    +def prepare_github_workflow_template(content, recipe, facts)
    +  return content unless recipe.fetch(:target_path).to_s == ".github/workflows/framework-ci.yml"
    +  return content if facts.to_h.dig(:ci, :framework_matrix).to_h.empty?
    +
    +  synchronize_github_actions_framework_ci(content, facts)
     end
    -
    # File 'lib/kettle/jem.rb', line 5761
    +      
    # File 'lib/kettle/jem.rb', line 5398
     
    -def merge_json_template_source(template_content, destination_content, recipe, file_type)
    -  output = Json::Merge::SmartMerger.new(
    -    template_content,
    -    destination_content,
    -    **json_merge_options(recipe)
    -  ).merge
    -  {ok: true, output: output, diagnostics: []}
    -rescue Json::Merge::Error => e
    -  {ok: false, output: destination_content, diagnostics: [{kind: "#{file_type}_merge_failed", message: e.message}]}
    +def prepare_readme_template(content, readme_style)
    +  style = readme_style || {}
    +  prepared = prune_readme_integration_badges(content, style)
    +  if style[:workflow_paths]
    +    prepared = ReadmePostProcessor.process(
    +      content: prepared,
    +      min_ruby: "0",
    +      workflow_paths: style[:workflow_paths]
    +    )
    +  end
    +  prepared = prune_missing_workflow_link_definitions(prepared, style[:workflow_paths]) if style[:workflow_paths]
    +  prepared = ReadmePostProcessor.prune_orphaned_workflow_inline_references(prepared) if style[:workflow_paths]
    +  omitted_sections = Array(style[:omitted_sections]).map(&:to_s)
    +  omitted_sections << "security" if style.key?(:security_enabled) && !style[:security_enabled]
    +  omitted_sections << "floss_funding" if style.key?(:floss_funding_enabled) && !style[:floss_funding_enabled]
    +  remove_readme_sections(prepared, omitted_sections.map { |section| section.tr("_", " ") })
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -34785,9 +51045,9 @@

    -

    +

    - .merge_prism_gemfile_template_source(template_content, destination_content) ⇒ Object + .preserve_gemspec_dependency_lines(template_content, destination_content, template_receiver:, destination_receiver:, facts: nil) ⇒ Object @@ -34799,29 +51059,53 @@

     
     
    -5124
    -5125
    -5126
    -5127
    -5128
    -5129
    -5130
    -5131
    -5132
    -5133
    +8197 +8198 +8199 +8200 +8201 +8202 +8203 +8204 +8205 +8206 +8207 +8208 +8209 +8210 +8211 +8212 +8213 +8214 +8215 +8216 +8217 +8218

    @@ -34829,9 +51113,9 @@

    -

    +

    - .merge_rbs_template_source(template_content, destination_content, recipe) ⇒ Object + .preserve_gemspec_freeze_blocks(content, destination_content, facts:, receiver:) ⇒ Object @@ -34843,29 +51127,47 @@

     
     
    -5809
    -5810
    -5811
    -5812
    -5813
    -5814
    -5815
    -5816
    -5817
    -5818
    +8220 +8221 +8222 +8223 +8224 +8225 +8226 +8227 +8228 +8229 +8230 +8231 +8232 +8233 +8234 +8235 +8236 +8237 +8238

    @@ -34873,9 +51175,9 @@

    -

    +

    - .merge_readme_template(template_content:, destination_content:, preserve_config: {}) ⇒ Object + .preserve_github_workflow_project_settings(recipe, content, destination_content, project_root:) ⇒ Object @@ -34887,25 +51189,31 @@

     
     
    -9977
    -9978
    -9979
    -9980
    -9981
    -9982
    -9983
    -9984
    +5055 +5056 +5057 +5058 +5059 +5060 +5061 +5062 +5063 +5064 +5065

    @@ -34913,9 +51221,9 @@

    -

    +

    - .merge_ruby_template_source(file_type, recipe, template_content, destination_content, facts: nil) ⇒ Object + .preserve_mise_project_settings(recipe, content, destination_content, project_root:) ⇒ Object @@ -34927,35 +51235,27 @@

     
     
    -5110
    -5111
    -5112
    -5113
    -5114
    -5115
    -5116
    -5117
    -5118
    -5119
    -5120
    -5121
    -5122
    +4993 +4994 +4995 +4996 +4997 +4998 +4999 +5000 +5001

    @@ -34963,9 +51263,9 @@

    -

    +

    - .merge_template_gemfile_dependency_blocks(template_content, content, removable_gems, preserve_self_word_entries: false) ⇒ Object + .preserve_newer_github_workflow_action_pins(content, destination_content) ⇒ Object @@ -34977,39 +51277,45 @@

    -5172 -5173 -5174 -5175 -5176 -5177 -5178 -5179 -5180 -5181 -5182 -5183 -5184 -5185 -5186 +14651 +14652 +14653 +14654 +14655 +14656 +14657 +14658 +14659 +14660 +14661 +14662 +14663 +14664 +14665 +14666 +14667 +14668

    @@ -35017,9 +51323,9 @@

    -

    +

    - .metadata_value(metadata, key) ⇒ Object + .preserve_readme_front_sections(template_content, destination_content) ⇒ Object @@ -35031,23 +51337,41 @@

     
     
    -8584
    -8585
    -8586
    -8587
    -8588
    -8589
    -8590
    +12921 +12922 +12923 +12924 +12925 +12926 +12927 +12928 +12929 +12930 +12931 +12932 +12933 +12934 +12935 +12936

    @@ -35055,9 +51379,9 @@

    -

    +

    - .migrate_readme_logo_config(content) ⇒ Object + .preserve_readme_h1(merged_content, destination_content, preserve_config) ⇒ Object @@ -35069,55 +51393,31 @@

     
     
    -6728
    -6729
    -6730
    -6731
    -6732
    -6733
    -6734
    -6735
    -6736
    -6737
    -6738
    -6739
    -6740
    -6741
    -6742
    -6743
    -6744
    -6745
    -6746
    -6747
    -6748
    -6749
    -6750
    +13022 +13023 +13024 +13025 +13026 +13027 +13028 +13029 +13030 +13031 +13032

    @@ -35125,9 +51425,9 @@

    -

    +

    - .min_ruby_version(requirement) ⇒ Object + .preserve_readme_managed_block(merged_content, destination_content, marker) ⇒ Object @@ -35139,25 +51439,21 @@

     
     
    -9494
    -9495
    -9496
    -9497
    -9498
    -9499
    -9500
    -9501
    +13034 +13035 +13036 +13037 +13038 +13039

    @@ -35165,9 +51461,9 @@

    -

    +

    - .minimum_ruby_token(requirement) ⇒ Object + .preserve_readme_sections(template_content, destination_content, preserve_config) ⇒ Object @@ -35179,21 +51475,75 @@

     
     
    -8133
    -8134
    -8135
    -8136
    -8137
    -8138
    +12960 +12961 +12962 +12963 +12964 +12965 +12966 +12967 +12968 +12969 +12970 +12971 +12972 +12973 +12974 +12975 +12976 +12977 +12978 +12979 +12980 +12981 +12982 +12983 +12984 +12985 +12986 +12987 +12988 +12989 +12990 +12991 +12992

    @@ -35201,9 +51551,9 @@

    -

    +

    - .mit_readme_license_introObject + .previous_nonblank_line_number(content, line_number) ⇒ Object @@ -35215,17 +51565,21 @@

     
     
    -9609
    -9610
    -9611
    -9612
    +14123 +14124 +14125 +14126 +14127 +14128

    @@ -35233,9 +51587,9 @@

    -

    +

    - .monorepo_root_file_strategy(entry) ⇒ Object + .prism_call_nodes(node) ⇒ Object @@ -35247,23 +51601,33 @@

     
     
    -6973
    -6974
    -6975
    -6976
    -6977
    -6978
    -6979
    +5935 +5936 +5937 +5938 +5939 +5940 +5941 +5942 +5943 +5944 +5945 +5946

    @@ -35271,9 +51635,9 @@

    -

    +

    - .monorepo_root_gemfile_dependency_linesObject + .prism_parse_success(content) ⇒ Object @@ -35285,37 +51649,19 @@

     
     
    -3279
    -3280
    -3281
    -3282
    -3283
    -3284
    -3285
    -3286
    -3287
    -3288
    -3289
    -3290
    -3291
    -3292
    +6796 +6797 +6798 +6799 +6800

    @@ -35323,9 +51669,9 @@

    -

    +

    - .monorepo_root_gemfile_dependency_sync_step(project_root, report) ⇒ Object + .prism_ruby_merge_options(recipe) ⇒ Object @@ -35337,38 +51683,22 @@

    -3252 -3253 -3254 -3255 -3256 -3257 -3258 -3259 -3260 -3261 -3262 -3263 -3264 -3265 -3266 +6423 +6424 +6425 +6426 +6427 +6428 +6429

    @@ -35377,9 +51707,9 @@

    -

    +

    - .monorepo_root_template_profile?(facts) ⇒ Boolean + .prism_subtree_contains_call?(node, call_name) ⇒ Boolean @@ -35414,15 +51744,19 @@

     
     
    -7088
    -7089
    -7090
    +6114 +6115 +6116 +6117 +6118

    @@ -35430,148 +51764,55 @@

    -

    +

    - .monorepo_subgem_kettle_config_profile_sync_step(project_root, report) ⇒ Object + .prism_subtree_contains_simplecov_require?(node) ⇒ Boolean -

     
     
    -4843
    -4844
    -4845
    -4846
    -4847
    -4848
    -4849
    -4850
    -4851
    -4852
    -4853
    -4854
    +10645 +10646 +10647 +10648
    -
    # File 'lib/kettle/jem.rb', line 4843
    -
    -def merge_local_gem_overrides(content, destination_content, facts:, template_content: nil)
    -  template_gems = local_gems_assignment(content)
    -  template_gems = local_gems_assignment(template_content) if template_gems.empty?
    -  destination_gems = local_gems_assignment(destination_content)
    -  return content if template_gems.empty? && destination_gems.empty?
    +      
    # File 'lib/kettle/jem.rb', line 10645
     
    -  destination_gems = destination_gems.reject do |destination_gem|
    -    template_gems.any? { |template_gem| versioned_gem_name_update_candidate?(destination_gem, template_gem) }
    -  end
    -  gems = (template_gems + destination_gems).map(&:to_s).reject(&:empty?).uniq
    -  replace_local_gems_assignment(content, gems)
    +def present_template_token_value?(value)
    +  clean = value.to_s.strip
    +  !clean.empty? && !token_placeholder?(clean)
     end
    -
    # File 'lib/kettle/jem.rb', line 5124
    +      
    # File 'lib/kettle/jem.rb', line 8197
     
    -def merge_prism_gemfile_template_source(template_content, destination_content)
    -  Prism::Merge.merge_ruby(
    -    template_content,
    -    destination_content,
    -    "ruby",
    -    preference: :template,
    -    add_template_only_nodes: true,
    -    signature_generator: Prism::Merge.ruby_dsl_signature_generator
    -  )
    +def preserve_gemspec_dependency_lines(template_content, destination_content, template_receiver:, destination_receiver:, facts: nil)
    +  namespace = facts.to_h.dig(:rubygems, :namespace).to_s
    +  template_dependencies = gemspec_dependency_line_index(template_content, receiver: template_receiver)
    +  destination_dependencies = gemspec_dependency_line_index(destination_content, receiver: destination_receiver)
    +    .transform_values do |source|
    +      normalized = normalize_gemspec_receiver(source, from: destination_receiver, to: template_receiver)
    +      normalized = normalize_gemspec_dependency_version_requirements(normalized, receiver: template_receiver, namespace: namespace)
    +      enforce_gemspec_dependency_minimum_requirements(normalized, receiver: template_receiver)
    +    end
    +  destination_dependencies = destination_dependencies.reject do |key, _source|
    +    retired_gemspec_development_dependency_key?(key)
    +  end
    +  return template_content if destination_dependencies.empty?
    +
    +  replacements, additions = destination_dependencies.partition do |key, source|
    +    template_dependencies.key?(key) &&
    +      gemspec_dependency_source_newer?(source, template_dependencies.fetch(key), receiver: template_receiver)
    +  end.map(&:to_h)
    +
    +  merged = replace_matching_gemspec_dependency_lines(template_content, replacements, receiver: template_receiver)
    +  append_missing_gemspec_dependency_lines(merged, additions, receiver: template_receiver)
     end
    -
    # File 'lib/kettle/jem.rb', line 5809
    +      
    # File 'lib/kettle/jem.rb', line 8220
     
    -def merge_rbs_template_source(template_content, destination_content, recipe)
    -  output = Rbs::Merge::SmartMerger.new(
    -    template_content,
    -    destination_content,
    -    **rbs_merge_options(recipe)
    -  ).merge
    -  {ok: true, output: output, diagnostics: []}
    -rescue Rbs::Merge::Error => e
    -  {ok: false, output: destination_content, diagnostics: [{kind: "rbs_merge_failed", message: e.message}]}
    +def preserve_gemspec_freeze_blocks(content, destination_content, facts:, receiver:)
    +  blocks = freeze_marker_blocks(destination_content, freeze_token: facts.to_h.dig(:project_runtime, :freeze_token))
    +  return content if blocks.empty?
    +
    +  merged = content.to_s
    +  blocks.each do |block|
    +    next if gemspec_freeze_block_structurally_managed?(block, receiver: receiver)
    +    next if merged.include?(block.join)
    +
    +    insertion = "\n#{block.join}\n"
    +    require_paths = gemspec_assignment_records(merged, receiver: receiver).find { |record| record.fetch(:field) == "require_paths" }
    +    merged = if require_paths
    +      insert_lines_before(merged, require_paths.fetch(:start_line), insertion)
    +    else
    +      insert_lines_before(merged, gemspec_end_line(merged), insertion)
    +    end
    +  end
    +  ensure_trailing_newline(merged.gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 9977
    +      
    # File 'lib/kettle/jem.rb', line 5055
     
    -def merge_readme_template(template_content:, destination_content:, preserve_config: {})
    -  return template_content if destination_content.to_s.strip.empty?
    +def preserve_github_workflow_project_settings(recipe, content, destination_content, project_root:)
    +  return content unless recipe.fetch(:target_path).to_s == ".github/workflows/coverage.yml"
     
    -  with_front_sections = preserve_readme_front_sections(template_content, destination_content)
    -  preserved = preserve_readme_sections(with_front_sections, destination_content, preserve_config)
    -  with_h1 = preserve_readme_h1(preserved, destination_content, preserve_config)
    -  preserve_readme_managed_block(with_h1, destination_content, "kettle-jem:metadata")
    +  thresholds = coverage_thresholds_from_project_mise(project_root)
    +  thresholds = coverage_thresholds_from_yaml_workflow(destination_content) if thresholds.empty?
    +  preserved = content
    +  thresholds.each do |key, value|
    +    preserved = replace_yaml_scalar_line(preserved, key, value)
    +  end
    +  preserved
     end
    -
    # File 'lib/kettle/jem.rb', line 5110
    +      
    # File 'lib/kettle/jem.rb', line 4993
     
    -def merge_ruby_template_source(file_type, recipe, template_content, destination_content, facts: nil)
    -  return merge_prism_gemfile_template_source(template_content, destination_content) if file_type == :gemfile
    +def preserve_mise_project_settings(recipe, content, destination_content, project_root:)
    +  return content unless recipe.fetch(:target_path).to_s == "mise.toml"
     
    -  Prism::Merge.merge_ruby(
    -    template_content,
    -    destination_content,
    -    "ruby",
    -    preference: :destination,
    -    add_template_only_nodes: true,
    -    signature_generator: Prism::Merge.ruby_dsl_signature_generator(require_aliases: ruby_require_aliases(recipe, facts)),
    -    **prism_ruby_merge_options(recipe)
    -  )
    +  thresholds = coverage_thresholds_from_mise(destination_content)
    +  thresholds = coverage_thresholds_from_workflow(project_root) if thresholds.empty?
    +  thresholds.reduce(content.to_s) do |preserved, (key, value)|
    +    replace_toml_string_scalar_line(preserved, key, value)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 5172
    +      
    # File 'lib/kettle/jem.rb', line 14651
     
    -def merge_template_gemfile_dependency_blocks(template_content, content, removable_gems, preserve_self_word_entries: false)
    -  template = remove_gemfile_dependency_blocks(template_content, removable_gems)
    -  template = remove_gemfile_percent_w_entries(template, removable_gems) unless preserve_self_word_entries
    -  existing = gemfile_dependency_names(content) + gemfile_percent_w_names(content)
    -  additions = gemfile_paragraphs(template).filter_map do |paragraph|
    -    names = gemfile_dependency_names(paragraph) + gemfile_percent_w_names(paragraph)
    -    next if names.empty?
    -    next if (names - existing).empty?
    +def preserve_newer_github_workflow_action_pins(content, destination_content)
    +  destination_records = github_workflow_action_pin_records(destination_content)
    +  return content if destination_records.empty?
     
    -    paragraph
    +  destination_by_key = destination_records.to_h { |record| [github_workflow_action_pin_key(record), record] }
    +  lines = content.to_s.lines
    +  github_workflow_action_pin_records(content).each do |record|
    +    destination = destination_by_key[github_workflow_action_pin_key(record)]
    +    next unless destination
    +    next if destination.fetch(:sha) == record.fetch(:sha)
    +
    +    lines[record.fetch(:line_index)] = replace_github_workflow_action_pin_sha(
    +      lines.fetch(record.fetch(:line_index)),
    +      destination.fetch(:sha)
    +    )
       end
    -  return content if additions.empty?
    -
    -  insert_gemfile_dependency_blocks(content, additions)
    +  lines.join
     end
    -
    # File 'lib/kettle/jem.rb', line 8584
    +      
    # File 'lib/kettle/jem.rb', line 12921
     
    -def (, key)
    -  value = [key]
    -  return if value.nil?
    +def preserve_readme_front_sections(template_content, destination_content)
    +  front_sections = readme_destination_front_sections(destination_content)
    +  return template_content if front_sections.empty?
     
    -  text = value.to_s.strip
    -  text unless text.empty?
    +  template_sections = markdown_sections(template_content)
    +  template_h1 = template_sections.find { |section| section.fetch(:level) == 1 }
    +  insert_before = template_sections.find do |section|
    +    section.fetch(:level) == 2 && section.fetch(:start) > template_h1.to_h.fetch(:start, -1)
    +  end
    +  return template_content unless insert_before
    +
    +  lines = template_content.split("\n", -1)
    +  inserted = front_sections.map { |section| "#{section.fetch(:heading)}\n#{section.fetch(:body).rstrip}" }.join("\n\n")
    +  lines[(template_h1.fetch(:start) + 1)...insert_before.fetch(:start)] = ["", *inserted.split("\n"), ""]
    +  lines.join("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 6728
    -
    -def migrate_readme_logo_config(content)
    -  config = YAML.safe_load(content.to_s, permitted_classes: [], aliases: true) || {}
    -  readme_config = config["readme"]
    -  return content unless readme_config.is_a?(Hash)
    -
    -  configured_specs = normalized_readme_logo_specs(readme_config["top_logos"] || readme_config["top_logo_options"])
    -  configured = configured_specs.map { |spec| spec.fetch(:type) }
    -  return content if configured.empty?
    +      
    # File 'lib/kettle/jem.rb', line 13022
     
    -  top_logo_specs = configured_specs.select { |spec| README_TOP_LOGO_DEFAULTS.include?(spec.fetch(:type)) }
    -  h2_synopsis_logo_specs = normalized_readme_logo_specs(readme_config["h2_synopsis_logos"])
    -  h2_synopsis_logo_specs = configured_specs.select { |spec| README_H2_SYNOPSIS_LOGO_DEFAULTS.include?(spec.fetch(:type)) } if h2_synopsis_logo_specs.empty?
    -  top_logos = top_logo_specs.map { |spec| readme_logo_config_value(spec) }
    -  h2_synopsis_logos = h2_synopsis_logo_specs.map { |spec| readme_logo_config_value(spec) }
    -  return content if h2_synopsis_logos.empty? && top_logos == configured
    +def preserve_readme_h1(merged_content, destination_content, preserve_config)
    +  return merged_content if preserve_config.empty?
     
    -  migrated = replace_yaml_scalar_path(content, %w[readme top_logos], top_logos.join(","))
    -  return replace_yaml_scalar_path(migrated, %w[readme h2_synopsis_logos], h2_synopsis_logos.join(",")) if readme_config.key?("h2_synopsis_logos")
    +  merged_h1 = markdown_sections(merged_content).find { |section| section.fetch(:level) == 1 }
    +  destination_h1 = markdown_sections(destination_content).find { |section| section.fetch(:level) == 1 }
    +  return merged_content unless merged_h1 && destination_h1
     
    -  insert_yaml_scalar_after_path(migrated, %w[readme top_logos], "h2_synopsis_logos", h2_synopsis_logos.join(","))
    -rescue Psych::Exception
    -  content
    +  lines = merged_content.split("\n", -1)
    +  lines[merged_h1.fetch(:start)] = destination_h1.fetch(:heading)
    +  lines.join("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 9494
    +      
    # File 'lib/kettle/jem.rb', line 13034
     
    -def min_ruby_version(requirement)
    -  token = minimum_ruby_token(requirement)
    -  return if token.empty?
    +def preserve_readme_managed_block(merged_content, destination_content, marker)
    +  destination_block = markdown_managed_block(destination_content, marker)
    +  return merged_content unless destination_block
     
    -  Gem::Version.new(token)
    -rescue ArgumentError
    -  nil
    +  replace_markdown_managed_block(merged_content, marker, destination_block)
     end
    -
    # File 'lib/kettle/jem.rb', line 8133
    +      
    # File 'lib/kettle/jem.rb', line 12960
     
    -def minimum_ruby_token(requirement)
    -  text = requirement.to_s.strip
    -  return "0" if text == "0"
    +def preserve_readme_sections(template_content, destination_content, preserve_config)
    +  template_sections = markdown_sections(template_content)
    +  destination_sections = markdown_sections(destination_content)
    +  destination_lookup = destination_sections.to_h { |section| [section.fetch(:base), section] }
    +  preserve_targets = readme_preserve_targets(template_sections, destination_lookup, preserve_config)
    +  return template_content if preserve_targets.empty?
     
    -  requirement.to_s[/\d+(?:\.\d+){1,2}/].to_s
    +  template_bases = template_sections.map { |section| section.fetch(:base) }.to_set
    +  extra_sections_by_anchor = readme_extra_preserved_sections_by_anchor(
    +    destination_sections,
    +    template_bases,
    +    preserve_targets
    +  )
    +  lines = template_content.split("\n", -1)
    +  template_sections.reverse_each do |section|
    +    base = section.fetch(:base)
    +    extra_sections = extra_sections_by_anchor[base].to_a
    +    next if !preserve_targets.include?(base) && extra_sections.empty?
    +
    +    replacement = if preserve_targets.include?(base)
    +      destination_section = destination_lookup[base] ||
    +        aliased_readme_destination_section(base, destination_lookup, preserve_config)
    +      next unless destination_section
    +
    +      "#{section.fetch(:heading)}\n#{destination_section.fetch(:body)}"
    +    else
    +      lines[section.fetch(:start)..section.fetch(:end)].join("\n")
    +    end
    +    replacement = ([replacement] + extra_sections.map { |extra| "#{extra.fetch(:heading)}\n#{extra.fetch(:body)}" }).join("\n")
    +    lines[section.fetch(:start)..section.fetch(:end)] = replacement
    +  end
    +  lines.join("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 9609
    +      
    # File 'lib/kettle/jem.rb', line 14123
     
    -def mit_readme_license_intro
    -  "The gem is available as open source under the terms of\n" \
    -    "the #{license_link("MIT")} #{license_badge("MIT")}."
    +def previous_nonblank_line_number(content, line_number)
    +  lines = content.to_s.lines
    +  cursor = line_number - 2
    +  cursor -= 1 while cursor >= 0 && lines[cursor].strip.empty?
    +  (cursor >= 0) ? cursor + 1 : nil
     end
    -
    # File 'lib/kettle/jem.rb', line 6973
    +      
    # File 'lib/kettle/jem.rb', line 5935
     
    -def monorepo_root_file_strategy(entry)
    -  if %w[CHANGELOG.md Gemfile].include?(entry.to_s)
    -    "keep_destination"
    -  else
    -    "accept_template"
    +def prism_call_nodes(node)
    +  return [] unless node
    +
    +  nodes = []
    +  stack = [node]
    +  until stack.empty?
    +    current = stack.pop
    +    nodes << current if current.is_a?(::Prism::CallNode)
    +    stack.concat(current.compact_child_nodes)
       end
    +  nodes
     end
    -
    # File 'lib/kettle/jem.rb', line 3279
    +      
    # File 'lib/kettle/jem.rb', line 6796
     
    -def monorepo_root_gemfile_dependency_lines
    -  [
    -    {name: "appraisal2", source: %(gem "appraisal2", "~> 3.1", ">= 3.1.2"\n)},
    -    {name: "bundler-audit", source: %(gem "bundler-audit", "~> 0.9.3"\n)},
    -    {name: "kettle-dev", source: %(gem "kettle-dev", "~> 2.2", ">= 2.2.8"\n)},
    -    {name: "kettle-drift", source: %(gem "kettle-drift", "~> 1.0", ">= 1.0.3"\n)},
    -    {name: "kettle-jem", source: %(gem "kettle-jem", "~> 7.0", ">= 7.0.0"\n)},
    -    {name: "kettle-test", source: %(gem "kettle-test", "~> 2.0", ">= 2.0.5"\n)},
    -    {name: "rake", source: %(gem "rake", "~> 13.0"\n)},
    -    {name: "rspec", source: %(gem "rspec", "~> 3.0"\n)},
    -    {name: "stone_checksums", source: %(gem "stone_checksums", "~> 1.0", ">= 1.0.3"\n)},
    -    {name: "turbo_tests2", source: %(gem "turbo_tests2", "~> 3.1", ">= 3.1.3"\n)}
    -  ].freeze
    +def prism_parse_success(content)
    +  ensure_runtime_dependencies!
    +  result = ::Prism.parse(content.to_s)
    +  result if result.success?
     end
    -
    # File 'lib/kettle/jem.rb', line 3252
    -
    -def monorepo_root_gemfile_dependency_sync_step(project_root, report)
    -  facts = report.fetch(:facts)
    -  return unless monorepo_root_template_profile?(facts)
    +      
    # File 'lib/kettle/jem.rb', line 6423
     
    -  path = File.join(project_root.to_s, "Gemfile")
    -  before = File.exist?(path) ? File.read(path) : %(source "https://gem.coop"\n)
    -  after = ensure_monorepo_root_gemfile_dependencies(before)
    -  File.write(path, after) if after != before
    +def prism_ruby_merge_options(recipe)
       {
    -    name: "monorepo_root_gemfile_dependency_sync",
    -    path: "Gemfile",
    -    status: (after == before) ? "already_current" : "applied",
    -    changed_files: (after == before) ? [] : ["Gemfile"]
    +    method_move_policy: ruby_method_move_policy(recipe),
    +    merge_template_requires: true,
    +    template_only_placement: :after_anchor
       }
     end
    -
    # File 'lib/kettle/jem.rb', line 7088
    +      
    # File 'lib/kettle/jem.rb', line 6114
     
    -def monorepo_root_template_profile?(facts)
    -  facts[:template_profile].to_s == MONOREPO_ROOT_TEMPLATE_PROFILE
    +def prism_subtree_contains_call?(node, call_name)
    +  node.breadth_first_search_all do |child|
    +    child.is_a?(::Prism::CallNode) && child.name == call_name
    +  end.any?
     end
    - - - - -
    -
    -
    -
    -3159
    -3160
    -3161
    -3162
    -3163
    -3164
    -3165
    -3166
    -3167
    -3168
    -3169
    -3170
    -3171
    -3172
    -3173
    -3174
    -3175
    -3176
    -3177
    -
    -
    # File 'lib/kettle/jem.rb', line 3159
    -
    -def monorepo_subgem_kettle_config_profile_sync_step(project_root, report)
    -  facts = report.fetch(:facts)
    -  return unless monorepo_subgem_template_profile?(facts)
    -
    -  profile = normalize_template_profile(facts[:template_profile])
    -  path = File.join(project_root.to_s, KETTLE_CONFIG_PATH)
    -  return unless File.file?(path)
    -
    -  gemspec = facts.dig(:rubygems, :gemspec_path).to_s
    -  before = File.read(path)
    -  after = sync_kettle_config_monorepo_subgem_profile(before, gemspec, profile)
    -  File.write(path, after) if after != before
    -  {
    -    name: "monorepo_subgem_kettle_config_profile_sync",
    -    path: KETTLE_CONFIG_PATH,
    -    status: (after == before) ? "already_current" : "applied",
    -    changed_files: (after == before) ? [] : [KETTLE_CONFIG_PATH]
    -  }
    -end
    -
    -
    +
    +
    -
    -

    - - .monorepo_subgem_template_entries(gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE) ⇒ Object - - - - - -

    - - - - -
    -
    -
    -
    -6993
    -6994
    -6995
    -6996
    -6997
    -6998
    -6999
    -7000
    -7001
    -
    -
    # File 'lib/kettle/jem.rb', line 6993
     
    -def monorepo_subgem_template_entries(gemspec_path, profile = MONOREPO_SUBGEM_TEMPLATE_PROFILE)
    -  entries = monorepo_subgem_template_entries_for_profile(gemspec_path, profile)
    -  gemspec = gemspec_path.to_s.strip
    -  return entries if gemspec.empty?
     
    -  entries.insert(1, {"source" => "gem.gemspec", "target" => gemspec})
    -  entries.concat(version_gem_template_entries(gemspec))
    -  entries
    -end
    -
    +
    - -
    -

    +
    - .monorepo_subgem_template_entries_for_profile(gemspec_path, profile) ⇒ Object +

    Returns:

    +
      - +
    • + + + (Boolean) + + + +
    • +
    - -

    +
    @@ -35580,9 +51821,9 @@

    -

    +

    - .monorepo_subgem_template_profile?(facts) ⇒ Boolean + .prism_subtree_contains_string?(node, string) ⇒ Boolean @@ -35617,15 +51858,19 @@

     
     
    -7084
    -7085
    -7086
    +6120 +6121 +6122 +6123 +6124

    @@ -35633,9 +51878,9 @@

    -

    +

    - .monorepo_subgem_template_profile_value?(profile) ⇒ Boolean + .process_result_adapter_failure?(merge_result) ⇒ Boolean @@ -35670,23 +51915,23 @@

    -7096 -7097 -7098 -7099 -7100 -7101 -7102 +6377 +6378 +6379 +6380 +6381 +6382 +6383

    @@ -35694,9 +51939,9 @@

    -

    +

    - .monorepo_template_profile?(facts) ⇒ Boolean + .project_appraisals_recording_enabled?(project_root) ⇒ Boolean @@ -35731,15 +51976,21 @@

     
     
    -7092
    -7093
    -7094
    +13889 +13890 +13891 +13892 +13893 +13894

    @@ -35747,9 +51998,9 @@

    -

    +

    - .non_mit_licenses?(licenses) ⇒ Boolean + .project_gemspec_declares_version_gem?(project_root) ⇒ Boolean @@ -35784,101 +52035,33 @@

     
     
    -9732
    -9733
    -9734
    - -

    - -
     
     
    -7003
    -7004
    -7005
    -7006
    -7007
    -7008
    -7009
    -7010
    -7011
    -7012
    -7013
    +5911 +5912 +5913 +5914 +5915
    -
    # File 'lib/kettle/jem.rb', line 7003
    +      
    # File 'lib/kettle/jem.rb', line 5911
     
    -def monorepo_subgem_template_entries_for_profile(gemspec_path, profile)
    -  case normalize_template_profile(profile)
    -  when MONOREPO_SUBGEM_RELEASE_TEMPLATE_PROFILE
    -    MONOREPO_SUBGEM_RELEASE_TEMPLATE_ENTRIES.dup
    -  when MONOREPO_SUBGEM_FULL_TEMPLATE_PROFILE
    -    project_root = File.dirname(File.expand_path(gemspec_path.to_s))
    -    template_inventory_entries(project_root, PACKAGED_TEMPLATE_ROOT).dup
    -  else
    -    MONOREPO_SUBGEM_TEMPLATE_ENTRIES.dup
    +def prism_subtree_contains_simplecov_require?(node)
    +  node.compact_child_nodes.any? do |child|
    +    simplecov_require_call_node?(child) || prism_subtree_contains_simplecov_require?(child)
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 7084
    +      
    # File 'lib/kettle/jem.rb', line 6120
     
    -def monorepo_subgem_template_profile?(facts)
    -  monorepo_subgem_template_profile_value?(facts[:template_profile])
    +def prism_subtree_contains_string?(node, string)
    +  node.breadth_first_search_all do |child|
    +    child.is_a?(::Prism::StringNode) && child.unescaped == string
    +  end.any?
     end
    -
    # File 'lib/kettle/jem.rb', line 7096
    +      
    # File 'lib/kettle/jem.rb', line 6377
     
    -def monorepo_subgem_template_profile_value?(profile)
    -  [
    -    MONOREPO_SUBGEM_PACKAGE_TEMPLATE_PROFILE,
    -    MONOREPO_SUBGEM_RELEASE_TEMPLATE_PROFILE,
    -    MONOREPO_SUBGEM_FULL_TEMPLATE_PROFILE
    -  ].include?(normalize_template_profile(profile))
    +def process_result_adapter_failure?(merge_result)
    +  diagnostics = merge_result.respond_to?(:fetch) ? merge_result.fetch(:diagnostics, []) : []
    +  diagnostics.any? do |diagnostic|
    +    message = diagnostic[:message] || diagnostic["message"]
    +    message.to_s.include?("TreeSitterLanguagePack::ProcessResult") && message.to_s.include?("undefined method")
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 7092
    +      
    # File 'lib/kettle/jem.rb', line 13889
     
    -def monorepo_template_profile?(facts)
    -  monorepo_root_template_profile?(facts) || monorepo_subgem_template_profile?(facts)
    +def project_appraisals_recording_enabled?(project_root)
    +  appraisals_path = File.join(project_root.to_s, "Appraisals")
    +  return false unless File.file?(appraisals_path)
    +
    +  gemfile_eval_paths(File.read(appraisals_path)).any? { |path| path.to_s.include?("modular/recording/") }
     end
    -
    # File 'lib/kettle/jem.rb', line 9732
    -
    -def non_mit_licenses?(licenses)
    -  licenses.any? { |license| license != "MIT" }
    -end
    +3947 +3948 +3949 +3950 +3951 +3952 +3953 +3954 +3955 +3956 +3957 +3958
    -
    - -
    -

    - - .normalize_changelog(content, facts) ⇒ Object - - - - - -

    - - @@ -35886,9 +52069,9 @@

    -

    +

    - .normalize_eval_gemfile_ruby_bucket(path) ⇒ Object + .project_gemspec_metadata(project_root, gemspec_path, spec: nil) ⇒ Object @@ -35900,25 +52083,73 @@

     
     
    -5558
    -5559
    -5560
    -5561
    -5562
    -5563
    -5564
    -5565
    +11106 +11107 +11108 +11109 +11110 +11111 +11112 +11113 +11114 +11115 +11116 +11117 +11118 +11119 +11120 +11121 +11122 +11123 +11124 +11125 +11126 +11127 +11128 +11129 +11130 +11131 +11132 +11133 +11134 +11135 +11136 +11137

    @@ -35926,9 +52157,9 @@

    -

    +

    - .normalize_gemspec_project_emoji(line, facts, field:) ⇒ Object + .project_gemspec_version(project_root) ⇒ Object @@ -35940,49 +52171,21 @@

     
     
    -6221
    -6222
    -6223
    -6224
    -6225
    -6226
    -6227
    -6228
    -6229
    -6230
    -6231
    -6232
    -6233
    -6234
    -6235
    -6236
    -6237
    -6238
    -6239
    -6240
    +3940 +3941 +3942 +3943 +3944 +3945

    @@ -35990,9 +52193,9 @@

    -

    +

    - .normalize_gemspec_receiver(line, from:, to:) ⇒ Object + .project_homepage_uri(config, env, yard_host:, gemspec_homepage_uri: nil) ⇒ Object @@ -36004,27 +52207,25 @@

     
     
    -6211
    -6212
    -6213
    -6214
    -6215
    -6216
    -6217
    -6218
    -6219
    +11270 +11271 +11272 +11273 +11274 +11275 +11276 +11277

    @@ -36032,9 +52233,9 @@

    -

    +

    - .normalize_generated_rakefile(content) ⇒ Object + .project_namespace(entrypoint_namespace:, version_namespace:, metadata_namespace:, default_namespace:) ⇒ Object @@ -36046,23 +52247,31 @@

     
     
    -4172
    -4173
    -4174
    -4175
    -4176
    -4177
    -4178
    +11365 +11366 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11374 +11375

    @@ -36070,61 +52279,56 @@

    -

    +

    - .normalize_git_source_url(url) ⇒ Object + .project_recording_enabled?(project_root, config) ⇒ Boolean -

    -
    +      
    # File 'lib/kettle/jem.rb', line 3947
     
    +def project_gemspec_declares_version_gem?(project_root)
    +  path = Dir.glob(File.join(project_root, "*.gemspec")).min
    +  return false unless path
     
    -3646
    -3647
    -3648
    -3649
    -3650
    -3651
    -3652
    -3653
    -3654
    -3655
    -3656
    -3657
    -3658
    -3659
    -3660
    -3661
    -3662
    -3663
    -3664
    -3665
    -3666
    -3667
    -3668
    -3669
    -3670
    -3671
    -3672
    -3673
    -3674
    -3675
    -3676
    -
    -
    # File 'lib/kettle/jem.rb', line 3646
    -
    -def normalize_changelog(content, facts)
    -  text = content.to_s
    -  title = "# Changelog"
    -  headings = markdown_heading_owners(text, source_label: "CHANGELOG.md")
    -  unless headings.any? { |heading| heading.level == 1 }
    -    text = "#{title}\n\n#{text}"
    -    headings = markdown_heading_owners(text, source_label: "CHANGELOG.md")
    +   = (path)
    +  dependencies = Array([:runtime_dependencies] || ["runtime_dependencies"])
    +  if dependencies.empty?
    +    spec = load_project_gemspec(path)
    +    dependencies = Array(spec&.runtime_dependencies)
       end
    -  return ensure_trailing_newline(text) if headings.any? { |heading| heading.level == 2 && changelog_unreleased_heading?(heading.heading_text) }
    -
    -  lines = text.split("\n", -1)
    -  insert_at = headings.find { |heading| heading.level == 2 }&.location&.start_line&.-(1) || lines.length
    -  section = [
    -    "## [Unreleased]",
    -    "",
    -    "### Added",
    -    "",
    -    "### Changed",
    -    "",
    -    "### Deprecated",
    -    "",
    -    "### Removed",
    -    "",
    -    "### Fixed",
    -    "",
    -    "### Security",
    -    ""
    -  ]
    -  lines.insert(insert_at, *section)
    -  ensure_trailing_newline(lines.join("\n").gsub(/\n{3,}/, "\n\n"))
    +  dependencies.any? { |dependency| dependency.name == "version_gem" }
     end
    -
    # File 'lib/kettle/jem.rb', line 5558
    +      
    # File 'lib/kettle/jem.rb', line 11106
     
    -def normalize_eval_gemfile_ruby_bucket(path)
    -  segments = path.to_s.split("/", -1)
    -  bucket_index = segments.index { |segment| ruby_bucket_path_segment?(segment) }
    -  return unless bucket_index
    +def (project_root, gemspec_path, spec: nil)
    +   = quiet_gemspec_reader_load(project_root)
    +  spec ||= load_project_gemspec(gemspec_path)
    +   = {} unless .is_a?(Hash)
    +   = .dup
     
    -  segments[bucket_index] = "{ruby}"
    -  segments.join("/")
    +  if spec
    +    [:gemspec_path] ||= gemspec_path
    +    [:gem_name] = spec.name.to_s if (, :gem_name).nil?
    +    [:version] = spec.version.to_s if (, :version).nil?
    +    [:min_ruby] = min_ruby_version(spec.required_ruby_version) if [:min_ruby].nil?
    +    [:homepage] = spec.homepage.to_s if (, :homepage).nil?
    +    [:homepage_uri] = spec..fetch("homepage_uri", nil) if (, :homepage_uri).nil?
    +    [:source_code_uri] = spec..fetch("source_code_uri", nil) if (, :source_code_uri).nil?
    +    [:funding_uri] = spec..fetch("funding_uri", nil) if (, :funding_uri).nil?
    +    [:authors] = Array(spec.authors).compact.uniq if Array([:authors]).empty?
    +    [:email] = Array(spec.email).compact.uniq if Array([:email]).empty?
    +    [:summary] = spec.summary.to_s if (, :summary).nil?
    +    [:description] = spec.description.to_s if (, :description).nil?
    +    [:licenses] = Array(spec.licenses) if Array([:licenses]).empty?
    +    [:required_ruby_version] = spec.required_ruby_version if [:required_ruby_version].nil?
    +    [:require_paths] = Array(spec.require_paths) if Array([:require_paths]).empty?
    +    [:bindir] = spec.bindir.to_s if (, :bindir).nil?
    +    [:executables] = Array(spec.executables) if Array([:executables]).empty?
    +  end
    +
    +  return {} unless present_template_token_value?([:gem_name])
    +
    +  
    +rescue LoadError, StandardError
    +  (gemspec_path)
     end
    -
    # File 'lib/kettle/jem.rb', line 6221
    -
    -def normalize_gemspec_project_emoji(line, facts, field:)
    -  return line unless %w[summary description].include?(field.to_s)
    -  return line unless facts&.dig(:project_runtime, :project_emoji_configured)
    -
    -  project_emoji = facts&.dig(:project_runtime, :project_emoji).to_s
    -  return line if project_emoji.empty?
    +      
    # File 'lib/kettle/jem.rb', line 3940
     
    -  record = gemspec_assignment_records(line).find { |candidate| candidate.fetch(:field) == field.to_s }
    -  value = record&.fetch(:value)
    -  return line unless value.is_a?(String)
    -  return line if value.lstrip.start_with?("<<")
    +def project_gemspec_version(project_root)
    +  path = Dir.glob(File.join(project_root, "*.gemspec")).min
    +  return "" unless path
     
    -  if value.start_with?('"', "'")
    -    quote = value[0]
    -    value_body = value[1..].to_s
    -    line.sub(value, "#{quote}#{project_emoji} #{strip_leading_decorative_graphemes(value_body)}")
    -  else
    -    line.sub(value, "#{project_emoji} #{strip_leading_decorative_graphemes(value)}")
    -  end
    +  load_project_gemspec(path)&.version.to_s
     end
    -
    # File 'lib/kettle/jem.rb', line 6211
    -
    -def normalize_gemspec_receiver(line, from:, to:)
    -  return line if from.to_s.empty? || to.to_s.empty? || from == to
    -
    -  leading = line.to_s.length - line.to_s.lstrip.length
    -  stripped = line.to_s[leading..].to_s
    -  return line unless stripped.start_with?("#{from}.")
    +      
    # File 'lib/kettle/jem.rb', line 11270
     
    -  "#{line.to_s[0...leading]}#{to}#{stripped[from.to_s.length..]}"
    +def project_homepage_uri(config, env, yard_host:, gemspec_homepage_uri: nil)
    +  derived = if present_template_token_value?(gemspec_homepage_uri)
    +    gemspec_homepage_uri
    +  elsif present_template_token_value?(yard_host)
    +    "https://#{yard_host}"
    +  end
    +  preferred_template_token_value(derived, project_runtime_config_value(config, "homepage_uri"), env, "KJ_HOMEPAGE_URI").to_s
     end
    -
    # File 'lib/kettle/jem.rb', line 4172
    +      
    # File 'lib/kettle/jem.rb', line 11365
     
    -def normalize_generated_rakefile(content)
    -  return "" if content.to_s.empty?
    +def project_namespace(entrypoint_namespace:, version_namespace:, metadata_namespace:, default_namespace:)
    +  if namespace_descendant?(entrypoint_namespace, version_namespace)
    +    return version_namespace
    +  end
     
    -  stripped = strip_orphaned_rake_task_requires(content.to_s)
    -  spaced = normalize_rakefile_section_spacing(stripped)
    -  ensure_trailing_newline(spaced.rstrip)
    +  if namespace_descendant?(version_namespace, default_namespace) || namespace_descendant?(entrypoint_namespace, default_namespace)
    +    return default_namespace
    +  end
    +
    +  entrypoint_namespace || version_namespace ||  || default_namespace
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -36132,9 +52336,9 @@

    -

    +

    - .normalize_github_actions_exec_cmd(command) ⇒ Object + .project_relative_path(path, project_root) ⇒ Object @@ -36146,21 +52350,25 @@

     
     
    -10834
    -10835
    -10836
    -10837
    -10838
    -10839
    +10991 +10992 +10993 +10994 +10995 +10996 +10997 +10998

    @@ -36168,9 +52376,9 @@

    -

    +

    - .normalize_list_option(value) ⇒ Object + .project_runtime_config_value(config, key) ⇒ Object @@ -36182,17 +52390,25 @@

     
     
    -7184
    -7185
    -7186
    -7187
    +11279 +11280 +11281 +11282 +11283 +11284 +11285 +11286

    @@ -36200,9 +52416,9 @@

    -

    +

    - .normalize_rakefile_section_spacing(content) ⇒ Object + .project_runtime_facts(config, env, package_name:, source_url:, author_domain:, min_ruby:, test_min_ruby:, version:, project_root: nil, gemspec_metadata: {}) ⇒ Object @@ -36214,25 +52430,105 @@

     
     
    -4180
    -4181
    -4182
    -4183
    -4184
    -4185
    -4186
    -4187
    - -

    + @@ -36240,9 +52536,9 @@

    -

    +

    - .normalize_readme_blank_line_runs(content) ⇒ Object + .project_runtime_template_tokens(project_runtime) ⇒ Object @@ -36254,19 +52550,43 @@

     
     
    -4396
    -4397
    -4398
    -4399
    -4400
    +11230 +11231 +11232 +11233 +11234 +11235 +11236 +11237 +11238 +11239 +11240 +11241 +11242 +11243 +11244 +11245 +11246

    @@ -36274,9 +52594,9 @@

    -

    +

    - .normalize_readme_heading(text) ⇒ Object + .project_yard_host(config, env, package_name:, author_domain:) ⇒ Object @@ -36288,15 +52608,17 @@

     
     
    -10172
    -10173
    -10174
    +11248 +11249 +11250 +11251

    @@ -36304,9 +52626,9 @@

    -

    +

    - .normalize_readme_project_heading(content, facts) ⇒ Object + .prune_appraisals_below_min_ruby(content, min_ruby) ⇒ Object @@ -36318,35 +52640,41 @@

     
     
    -4647
    -4648
    -4649
    -4650
    -4651
    -4652
    -4653
    -4654
    -4655
    -4656
    -4657
    -4658
    -4659
    +7293 +7294 +7295 +7296 +7297 +7298 +7299 +7300 +7301 +7302 +7303 +7304 +7305 +7306 +7307 +7308

    @@ -36354,9 +52682,9 @@

    -

    +

    - .normalize_readme_section_key(section) ⇒ Object + .prune_appraisals_recording_entries(content, facts) ⇒ Object @@ -36368,15 +52696,69 @@

     
     
    -9910
    -9911
    -9912
    +7065 +7066 +7067 +7068 +7069 +7070 +7071 +7072 +7073 +7074 +7075 +7076 +7077 +7078 +7079 +7080 +7081 +7082 +7083 +7084 +7085 +7086 +7087 +7088 +7089 +7090 +7091 +7092 +7093 +7094

    @@ -36384,9 +52766,9 @@

    -

    +

    - .normalize_readme_synopsis_heading(content, facts) ⇒ Object + .prune_empty_parent_directories(project_root, relative_path) ⇒ Object @@ -36398,37 +52780,33 @@

     
     
    -4661
    -4662
    -4663
    -4664
    -4665
    -4666
    -4667
    -4668
    -4669
    -4670
    -4671
    -4672
    -4673
    -4674
    +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453

    @@ -36436,9 +52814,9 @@

    -

    +

    - .normalize_repository_topology(value) ⇒ Object + .prune_github_workflow_matrix_by_min_ruby(content, facts) ⇒ Object @@ -36450,25 +52828,47 @@

     
     
    -7210
    -7211
    -7212
    -7213
    -7214
    -7215
    -7216
    -7217
    +6205 +6206 +6207 +6208 +6209 +6210 +6211 +6212 +6213 +6214 +6215 +6216 +6217 +6218 +6219 +6220 +6221 +6222 +6223

    @@ -36476,9 +52876,9 @@

    -

    +

    - .normalize_template_profile(value) ⇒ Object + .prune_legacy_kettle_config_keys(content) ⇒ Object @@ -36490,31 +52890,21 @@

     
     
    -7189
    -7190
    -7191
    -7192
    -7193
    -7194
    -7195
    -7196
    -7197
    -7198
    -7199
    +8864 +8865 +8866 +8867 +8868 +8869

    @@ -36522,9 +52912,9 @@

    -

    +

     
     
    -9231
    -9232
    -9233
    -9234
    -9235
    -9236
    -9237
    -9238
    -9239
    -9240
    -9241
    -9242
    -9243
    -9244
    -9245
    -9246
    -9247
    +5432 +5433 +5434 +5435 +5436 +5437 +5438 +5439 +5440 +5441 +5442 +5443 +5444 +5445 +5446

    @@ -36580,9 +52966,9 @@

    -

    +

    - .normalized_readme_logo_width(value) ⇒ Object + .prune_readme_integration_badges(content, readme_style) ⇒ Object @@ -36594,21 +52980,39 @@

     
     
    -9249
    -9250
    -9251
    -9252
    -9253
    -9254
    +5416 +5417 +5418 +5419 +5420 +5421 +5422 +5423 +5424 +5425 +5426 +5427 +5428 +5429 +5430

    @@ -36616,9 +53020,9 @@

    -

    +

     
     
    -9227
    -9228
    -9229
    +5109 +5110 +5111 +5112 +5113 +5114 +5115 +5116 +5117 +5118

    @@ -36646,9 +53064,9 @@

    -

    +

    - .opencollective_disabled?(config, env: ENV) ⇒ Boolean + .prune_workflow_matrix_item?(mapping, minimum) ⇒ Boolean @@ -36683,15 +53101,27 @@

     
     
    -7854
    -7855
    -7856
    +6333 +6334 +6335 +6336 +6337 +6338 +6339 +6340 +6341

    @@ -36699,9 +53129,9 @@

    -

    +

    - .opencollective_disabled_file?(relative_path) ⇒ Boolean + .quality_config_path?(path) ⇒ Boolean @@ -36736,15 +53166,29 @@

     
     
    -7554
    -7555
    -7556
    +10137 +10138 +10139 +10140 +10141 +10142 +10143 +10144 +10145 +10146

    @@ -36752,9 +53196,9 @@

    -

    +

    - .opencollective_disabled_files(project_root) ⇒ Object + .quiet_gemspec_reader_load(project_root) ⇒ Object @@ -36766,19 +53210,29 @@

     
     
    -7548
    -7549
    -7550
    -7551
    -7552
    +11205 +11206 +11207 +11208 +11209 +11210 +11211 +11212 +11213 +11214

    @@ -36786,37 +53240,68 @@

    -

    +

    - .opencollective_falsey_env(env) ⇒ Object + .rakefile_default_task_call?(call) ⇒ Boolean -

     
     
    -9128
    -9129
    -9130
    -9131
    -9132
    -9133
    -9134
    -9135
    -9136
    -9137
    -9138
    -9139
    -9140
    -9141
    -9142
    -9143
    -9144
    -9145
    -9146
    +13883 +13884 +13885 +13886 +13887
    -
    # File 'lib/kettle/jem.rb', line 9128
    +      
    # File 'lib/kettle/jem.rb', line 13883
     
    -def normalize_git_source_url(url)
    -  value = url.to_s.strip
    -  return if value.empty?
    -
    -  if value.start_with?("git@github.com:")
    -    slug = value.split(":", 2).last.to_s.delete_suffix(".git")
    -    return "https://github.com/#{slug}" if slug.split("/").length >= 2
    -  end
    +def project_recording_enabled?(project_root, config)
    +  return true if appraisal_recording_enabled?(config)
     
    -  uri = URI.parse(value)
    -  if %w[http https].include?(uri.scheme) && uri.host == "github.com"
    -    slug = uri.path.to_s.delete_prefix("/").delete_suffix(".git")
    -    return "https://github.com/#{slug}" if slug.split("/").length >= 2
    -  end
    -
    -  value
    -rescue URI::InvalidURIError
    -  value
    +  project_appraisals_recording_enabled?(project_root)
     end
    -
    # File 'lib/kettle/jem.rb', line 10834
    +      
    # File 'lib/kettle/jem.rb', line 10991
     
    -def normalize_github_actions_exec_cmd(command)
    -  normalized = command.to_s.strip
    -  return "kettle-test" if OBSOLETE_APPRAISAL_SPEC_EXEC_CMDS.include?(normalized)
    +def project_relative_path(path, project_root)
    +  expanded_root = File.expand_path(project_root.to_s)
    +  expanded_path = File.expand_path(path.to_s)
    +  prefix = "#{expanded_root}#{File::SEPARATOR}"
    +  return expanded_path unless expanded_path.start_with?(prefix)
     
    -  normalized
    +  expanded_path[prefix.length..].to_s
     end
    -
    # File 'lib/kettle/jem.rb', line 7184
    +      
    # File 'lib/kettle/jem.rb', line 11279
     
    -def normalize_list_option(value)
    -  values = Array(value).flat_map { |entry| entry.to_s.split(",") }.map(&:strip).reject(&:empty?)
    -  values.empty? ? nil : values
    +def project_runtime_config_value(config, key)
    +  token_config = token_config_values(config)
    +  runtime_config = token_config["project_runtime"].is_a?(Hash) ? token_config["project_runtime"] : {}
    +  top_level_value = config[key]
    +  return top_level_value if present_template_token_value?(top_level_value)
    +
    +  runtime_config[key]
     end
    -
    # File 'lib/kettle/jem.rb', line 4180
    -
    -def normalize_rakefile_section_spacing(content)
    -  content.to_s.lines.each_with_object([]) do |line, normalized|
    -    if line.start_with?("### ")
    -      normalized.pop while normalized.length > 1 && normalized[-1].strip.empty? && normalized[-2].strip.empty?
    -    end
    -    normalized << line
    -  end.join
    +10887
    +10888
    +10889
    +10890
    +10891
    +10892
    +10893
    +10894
    +10895
    +10896
    +10897
    +10898
    +10899
    +10900
    +10901
    +10902
    +10903
    +10904
    +10905
    +10906
    +10907
    +10908
    +10909
    +10910
    +10911
    +10912
    +10913
    +10914
    +10915
    +10916
    +10917
    +10918
    +10919
    +10920
    +10921
    +10922
    +10923
    +10924
    +10925
    +10926
    +10927
    +10928
    +10929
    +10930
    +10931
    +10932
    +10933
    +10934
    +
    +
    # File 'lib/kettle/jem.rb', line 10887
    +
    +def project_runtime_facts(
    +  config,
    +  env,
    +  package_name:,
    +  source_url:,
    +  author_domain:,
    +  min_ruby:,
    +  test_min_ruby:,
    +  version:,
    +  project_root: nil,
    +  gemspec_metadata: {}
    +)
    +  run_timestamp = Time.now
    +  configured_project_emoji = preferred_template_token_value(nil, config["project_emoji"], env, "KJ_PROJECT_EMOJI")
    +  yard_host = project_yard_host(config, env, package_name: package_name, author_domain: author_domain)
    +  local_modular_eval_paths = local_modular_runtime_eval_paths(project_root, , package_name: package_name)
    +  direct_sibling_gems = direct_sibling_runtime_gems(
    +    project_root,
    +    ,
    +    package_name: package_name,
    +    local_modular_eval_paths: local_modular_eval_paths
    +  )
    +  compact_hash(
    +    freeze_token: config.dig("defaults", "freeze_token").to_s.empty? ? "kettle-jem" : config.dig("defaults", "freeze_token").to_s,
    +    kettle_jem_version: VERSION,
    +    template_run_date: run_timestamp.strftime("%Y-%m-%d"),
    +    template_run_year: run_timestamp.year.to_s,
    +    kettle_dev_gem: "kettle-dev",
    +    kettle_dev_local_gems: kettle_dev_local_gems(config),
    +    main_gemfile_nomono_bootstrap: main_gemfile_nomono_bootstrap(package_name),
    +    package_name: package_name.to_s,
    +    yard_host: yard_host,
    +    homepage_uri: project_homepage_uri(config, env, yard_host: yard_host, gemspec_homepage_uri: (, :homepage_uri)),
    +    project_emoji: preferred_template_token_value("💎", config["project_emoji"], env, "KJ_PROJECT_EMOJI").to_s,
    +    project_emoji_configured: !configured_project_emoji.to_s.empty?,
    +    min_divergence_threshold: preferred_template_token_value(nil, config["min_divergence_threshold"], env, "KJ_MIN_DIVERGENCE_THRESHOLD").to_s,
    +    min_dev_ruby: test_min_ruby.to_s,
    +    test_min_ruby: test_min_ruby.to_s,
    +    version: version.to_s,
    +    github_org: github_org_from_url(source_url).to_s,
    +    main_gemfile_direct_sibling_block: main_gemfile_direct_sibling_block(
    +      direct_sibling_gems,
    +      source_url: source_url,
    +      project_root: project_root,
    +      local_modular_eval_paths: local_modular_eval_paths.values.flatten
    +    )
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 4396
    -
    -def normalize_readme_blank_line_runs(content)
    -  return Ast::Merge.normalize_blank_line_runs(content) if Ast::Merge.respond_to?(:normalize_blank_line_runs)
    +      
    # File 'lib/kettle/jem.rb', line 11230
     
    -  collapse_excess_blank_lines(content)
    +def project_runtime_template_tokens(project_runtime)
    +  {
    +    "KJ|FREEZE_TOKEN" => project_runtime[:freeze_token].to_s,
    +    "KJ|KETTLE_JEM_VERSION" => project_runtime[:kettle_jem_version].to_s,
    +    "KJ|TEMPLATE_RUN_DATE" => project_runtime[:template_run_date].to_s,
    +    "KJ|TEMPLATE_RUN_YEAR" => project_runtime[:template_run_year].to_s,
    +    "KJ|KETTLE_DEV_GEM" => project_runtime[:kettle_dev_gem].to_s,
    +    "KJ|KETTLE_DEV_LOCAL_GEMS" => project_runtime[:kettle_dev_local_gems].to_s,
    +    "KJ|MAIN_GEMFILE_NOMONO_BOOTSTRAP" => project_runtime[:main_gemfile_nomono_bootstrap].to_s,
    +    "KJ|MAIN_GEMFILE_DIRECT_SIBLING_BLOCK" => project_runtime[:main_gemfile_direct_sibling_block].to_s,
    +    "KJ|PACKAGE_NAME" => project_runtime[:package_name].to_s,
    +    "KJ|YARD_HOST" => project_runtime[:yard_host].to_s,
    +    "KJ|HOMEPAGE_URI" => project_runtime[:homepage_uri].to_s,
    +    "KJ|PROJECT_EMOJI" => project_runtime[:project_emoji].to_s,
    +    "KJ|MIN_DIVERGENCE_THRESHOLD" => project_runtime[:min_divergence_threshold].to_s
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 10172
    +      
    # File 'lib/kettle/jem.rb', line 11248
     
    -def normalize_readme_heading(text)
    -  strip_readme_heading_adornment(text).strip.downcase
    +def project_yard_host(config, env, package_name:, author_domain:)
    +  derived = "#{package_name.to_s.tr("_", "-")}.#{author_domain.to_s.empty? ? "example.com" : author_domain}"
    +  preferred_template_token_value(derived, project_runtime_config_value(config, "yard_host"), env, "KJ_YARD_HOST").to_s
     end
    -
    # File 'lib/kettle/jem.rb', line 4647
    +      
    # File 'lib/kettle/jem.rb', line 7293
     
    -def normalize_readme_project_heading(content, facts)
    -  namespace = facts.dig(:rubygems, :namespace).to_s
    -  emoji = facts.dig(:project_runtime, :project_emoji).to_s
    -  return content if namespace.empty? || emoji.empty?
    +def prune_appraisals_below_min_ruby(content, min_ruby)
    +  return content if min_ruby.to_s.empty?
     
    -  lines = content.to_s.split("\n", -1)
    -  h1 = markdown_heading_owners(content, source_label: "README.md").find { |owner| owner.level == 1 }
    -  return content unless h1
    +  minimum = Gem::Version.new(min_ruby.to_s)
    +  remove_indexes = Set.new
    +  appraisal_call_records(content).each do |record|
    +    version = ruby_appraisal_name_version(record.fetch(:name))
    +    next unless version && version < minimum
     
    -  index = h1.location.start_line - 1
    -  lines[index] = "# #{emoji} #{namespace}"
    -  lines.join("\n")
    +    (record.fetch(:start_line)..record.fetch(:end_line)).each { |line_number| remove_indexes << (line_number - 1) }
    +  end
    +  kept = content.to_s.lines.each_with_index.reject { |_line, index| remove_indexes.include?(index) }.map(&:first)
    +  ensure_trailing_newline(kept.join.gsub(/\n{3,}/, "\n\n"))
    +rescue ArgumentError
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 9910
    +      
    # File 'lib/kettle/jem.rb', line 7065
     
    -def normalize_readme_section_key(section)
    -  normalize_readme_heading(section.to_s.tr("_-", " "))
    +def prune_appraisals_recording_entries(content, facts)
    +  remove_indexes = Set.new
    +  lines = content.to_s.lines
    +  unless facts.to_h.dig(:ci, :recording)
    +    ruby_call_records(content, :eval_gemfile).each do |call|
    +      path = ruby_string_argument(call)
    +      next unless path.to_s.include?("modular/recording/")
    +
    +      (call.location.start_line..ruby_node_source_end_line(call)).each { |line_number| remove_indexes << (line_number - 1) }
    +    end
    +  end
    +  head_appraisal = appraisal_call_records(content).find { |record| record.fetch(:name) == "head" }
    +  if head_appraisal
    +    gemfile_gem_call_records(content).each do |record|
    +      next unless record.fetch(:name) == "cgi"
    +      next unless record.fetch(:start_line) >= head_appraisal.fetch(:start_line)
    +      next unless record.fetch(:end_line) <= head_appraisal.fetch(:end_line)
    +
    +      start_index = record.fetch(:start_line) - 1
    +      while start_index.positive? && gemfile_comment_line?(lines[start_index - 1])
    +        start_index -= 1
    +      end
    +      (start_index..(record.fetch(:end_line) - 1)).each { |index| remove_indexes << index }
    +    end
    +  end
    +  return content if remove_indexes.empty?
    +
    +  kept = lines.each_with_index.reject { |_line, index| remove_indexes.include?(index) }.map(&:first)
    +  ensure_trailing_newline(kept.join.gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 4661
    +      
    # File 'lib/kettle/jem.rb', line 11442
     
    -def normalize_readme_synopsis_heading(content, facts)
    -  logo_row = facts.dig(:readme_logo, :h2_synopsis_logo_row).to_s
    -  return content if logo_row.empty?
    -
    -  lines = content.to_s.split("\n", -1)
    -  h2 = markdown_heading_owners(content, source_label: "README.md").find do |owner|
    -    owner.level == 2 && owner.base.to_s == "synopsis"
    +def prune_empty_parent_directories(project_root, relative_path)
    +  current = relative_path.to_s
    +  while !current.empty? && current != "."
    +    path = File.join(project_root, current)
    +    begin
    +      Dir.rmdir(path)
    +    rescue SystemCallError
    +      break
    +    end
    +    current = File.dirname(current)
       end
    -  return content unless h2
    -
    -  index = h2.location.start_line - 1
    -  lines[index] = "## 🌻 Synopsis #{logo_row}"
    -  lines.join("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 7210
    +      
    # File 'lib/kettle/jem.rb', line 6205
     
    -def normalize_repository_topology(value)
    -  topology = value.to_s.strip.downcase.tr("_", "-")
    -  return "" if topology.empty?
    -  return REPOSITORY_TOPOLOGY_MONOREPO_SUBPROJECT if %w[monorepo-subproject monorepo-subgem monorepo-package subproject subgem].include?(topology)
    -  return REPOSITORY_TOPOLOGY_STANDALONE if %w[standalone single-repo repo].include?(topology)
    +def prune_github_workflow_matrix_by_min_ruby(content, facts)
    +  min_ruby = minimum_ruby_token(facts.to_h.dig(:ci, :test_min_ruby) || facts.to_h.dig(:rubygems, :min_ruby))
    +  return content if min_ruby.to_s.empty?
     
    -  topology
    +  minimum = Gem::Version.new(min_ruby)
    +  lines = content.to_s.lines
    +  remove_indexes = Set.new
    +  yaml_mapping_nodes(content).each do |mapping|
    +    next unless prune_workflow_matrix_item?(mapping, minimum)
    +
    +    (mapping.start_line...mapping.end_line).each { |line_index| remove_indexes << line_index }
    +  end
    +
    +  return content if remove_indexes.empty?
    +
    +  ensure_trailing_newline(lines.each_with_index.reject { |_line, line_index| remove_indexes.include?(line_index) }.map(&:first).join.gsub(/\n{3,}/, "\n\n"))
    +rescue
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 7189
    -
    -def normalize_template_profile(value)
    -  profile = value.to_s.strip.downcase.tr("_", "-")
    -  return "" if profile.empty?
    -  return FULL_TEMPLATE_PROFILE if %w[full large default standalone].include?(profile)
    -  return MONOREPO_SUBGEM_PACKAGE_TEMPLATE_PROFILE if %w[monorepo-subgem monorepo-subproject monorepo-package monorepo-subgem-package small thin package].include?(profile)
    -  return MONOREPO_SUBGEM_RELEASE_TEMPLATE_PROFILE if %w[monorepo-subgem-release monorepo-release release].include?(profile)
    -  return MONOREPO_SUBGEM_FULL_TEMPLATE_PROFILE if %w[monorepo-subgem-full monorepo-full subgem-full].include?(profile)
    -  return MONOREPO_ROOT_TEMPLATE_PROFILE if profile == MONOREPO_ROOT_TEMPLATE_PROFILE
    +      
    # File 'lib/kettle/jem.rb', line 8864
     
    -  profile
    +def prune_legacy_kettle_config_keys(content)
    +  pruned = KETTLE_CONFIG_LEGACY_KEY_PATHS.reduce(content.to_s) do |updated, legacy_key|
    +    remove_yaml_scalar_path(updated, legacy_key.fetch(:path))
    +  end
    +  remove_obsolete_simplecov_keep_destination_config(pruned)
     end
    -
    # File 'lib/kettle/jem.rb', line 9231
    +      
    # File 'lib/kettle/jem.rb', line 5432
     
    -def normalized_readme_logo_specs(value)
    -  raw_values = case value
    -  when String
    -    value.split(",")
    -  when Array
    -    value
    -  else
    -    []
    -  end
    -  raw_values.filter_map do |raw_value|
    -    raw_type, raw_width = raw_value.to_s.split("|", 2)
    -    normalized = raw_type.to_s.strip.downcase.tr("-", "_")
    -    next unless README_TOP_LOGO_OPTIONS.include?(normalized)
    +def prune_missing_workflow_link_definitions(content, workflow_paths)
    +  ensure_runtime_dependencies!
    +  existing = Array(workflow_paths).map { |path| path.to_s.delete_prefix("./") }.to_set
    +  Ast::Crispr::Markdown::Markly.document_context(content: content.to_s, source_label: "README.md")
    +    .structural_owners(owner_scope: :link_definitions)
    +    .reduce(content.to_s) do |processed, owner|
    +      workflow_path = readme_workflow_path_from_url(owner.url)
    +      next processed if workflow_path.empty? || existing.include?(workflow_path)
     
    -    {type: normalized, width: normalized_readme_logo_width(raw_width)}
    -  end.uniq
    +      delete_markdown_with_ast_crispr(
    +        processed,
    +        Ast::Crispr::Markdown::Markly::Selectors.link_definition(label: owner.label, limit: {at_least: 0})
    +      )
    +    end
     end
    -
    # File 'lib/kettle/jem.rb', line 9249
    -
    -def normalized_readme_logo_width(value)
    -  clean = value.to_s.strip
    -  return nil if clean.empty?
    +      
    # File 'lib/kettle/jem.rb', line 5416
     
    -  clean
    +def prune_readme_integration_badges(content, readme_style)
    +  ensure_runtime_dependencies!
    +  integrations = Array(readme_style[:missing_integrations]) + Array(readme_style[:disabled_integrations])
    +  integrations.uniq.reduce(content.to_s) do |result, integration|
    +    pruned_badges = README_INTEGRATION_BADGE_PATTERNS.fetch(integration.to_s, []).reduce(result) do |memo, pattern|
    +      memo.gsub(pattern, "")
    +    end
    +    README_INTEGRATION_LINK_LABELS.fetch(integration.to_s, []).reduce(pruned_badges) do |memo, label|
    +      delete_markdown_with_ast_crispr(
    +        memo,
    +        Ast::Crispr::Markdown::Markly::Selectors.link_definition(label: label, limit: {at_least: 0})
    +      )
    +    end
    +  end.gsub(/[ \t]{2,}/, " ")
     end
    -
    # File 'lib/kettle/jem.rb', line 9227
    +      
    # File 'lib/kettle/jem.rb', line 5109
     
    -def normalized_readme_top_logo_options(value)
    -  normalized_readme_logo_specs(value).map { |spec| spec.fetch(:type) }
    +def prune_unused_readme_logo_link_definitions(content)
    +  referenced = ReadmePostProcessor.markdown_inline_reference_owners(content).flat_map(&:labels).map(&:to_s).to_set
    +  labels = ReadmePostProcessor.markdown_link_definition_owners(content).filter_map do |owner|
    +    label = owner.label.to_s
    +    label if label.start_with?("🖼️") && !referenced.include?(label)
    +  end
    +  return content if labels.empty?
    +
    +  ReadmePostProcessor.delete_markdown_link_definitions(content, labels)
     end
    -
    # File 'lib/kettle/jem.rb', line 7854
    +      
    # File 'lib/kettle/jem.rb', line 6333
     
    -def opencollective_disabled?(config, env: ENV)
    -  opencollective_policy(config, env).fetch(:disabled)
    +def prune_workflow_matrix_item?(mapping, minimum)
    +  ruby = yaml_mapping_scalar_value(mapping, "ruby")
    +  return true if ruby && Gem::Version.new(ruby) < minimum
    +
    +  appraisal_ruby_version = appraisal_ruby_version(yaml_mapping_scalar_value(mapping, "appraisal"))
    +  appraisal_ruby_version && Gem::Version.new(appraisal_ruby_version) < minimum
    +rescue ArgumentError
    +  false
     end
    -
    # File 'lib/kettle/jem.rb', line 7554
    +      
    # File 'lib/kettle/jem.rb', line 10137
     
    -def opencollective_disabled_file?(relative_path)
    -  OPENCOLLECTIVE_DISABLED_FILES.include?(relative_path.to_s)
    +def quality_config_path?(path)
    +  %w[
    +    .rubocop.yml
    +    .reek.yml
    +    .standard.yml
    +    .simplecov
    +    .yardopts
    +    Rakefile
    +  ].include?(path)
     end
    -
    # File 'lib/kettle/jem.rb', line 7548
    +      
    # File 'lib/kettle/jem.rb', line 11205
     
    -def opencollective_disabled_files(project_root)
    -  OPENCOLLECTIVE_DISABLED_FILES.select do |relative_path|
    -    File.exist?(File.join(project_root, relative_path))
    -  end
    +def quiet_gemspec_reader_load(project_root)
    +  original_stderr = $stderr
    +  original_stdout = $stdout
    +  $stderr = StringIO.new
    +  $stdout = StringIO.new
    +  GemSpecReader.load(project_root)
    +ensure
    +  $stderr = original_stderr
    +  $stdout = original_stdout
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -36824,9 +53309,9 @@

    -

    +

    - .opencollective_org(project_root, config, env, opencollective_disabled: false) ⇒ Object + .rakefile_default_task_records(content) ⇒ Object @@ -36838,37 +53323,77 @@

     
     
    -7887
    -7888
    -7889
    -7890
    -7891
    -7892
    -7893
    -7894
    -7895
    -7896
    -7897
    -7898
    -7899
    -7900
    +14084 +14085 +14086 +14087 +14088 +14089 +14090 +14091 +14092 +14093

    + +
     
     
    -7879
    -7880
    -7881
    -7882
    -7883
    -7884
    -7885
    +14095 +14096 +14097 +14098 +14099 +14100 +14101 +14102 +14103 +14104 +14105
    -
    # File 'lib/kettle/jem.rb', line 7879
    +      
    # File 'lib/kettle/jem.rb', line 14095
     
    -def opencollective_falsey_env(env)
    -  %w[OPENCOLLECTIVE_HANDLE FUNDING_ORG].each do |key|
    -    value = env[key]
    -    return {key: key, value: value} if falsey_config?(value)
    +def rakefile_default_task_call?(call)
    +  argument = call.arguments&.arguments&.first
    +  case argument
    +  when ::Prism::SymbolNode
    +    argument.unescaped.to_s == "default"
    +  when ::Prism::KeywordHashNode
    +    argument.elements.any? { |element| element.key.is_a?(::Prism::SymbolNode) && element.key.unescaped.to_s == "default" }
    +  else
    +    false
       end
    -  nil
     end
    -
    # File 'lib/kettle/jem.rb', line 7887
    +      
    # File 'lib/kettle/jem.rb', line 14084
     
    -def opencollective_org(project_root, config, env, opencollective_disabled: false)
    -  return if opencollective_disabled
    +def rakefile_default_task_records(content)
    +  top_level_ruby_call_records(content, :task).filter_map do |call|
    +    next unless rakefile_default_task_call?(call)
     
    -  env_org = opencollective_org_env(env)
    -  return env_org if env_org
    +    {
    +      start_line: call.location.start_line,
    +      end_line: ruby_node_source_end_line(call)
    +    }
    +  end
    +end
    +
    +
    + +
    +

    + + .rakefile_require_records(content) ⇒ Object + - config_org = opencollective_org_config(config) - return config_org if config_org + - funding_org = opencollective_org_github_funding_file(project_root) - return funding_org if funding_org + +

    + + + @@ -36876,9 +53401,9 @@

    -

    +

    - .opencollective_org_config(config) ⇒ Object + .rakefile_scaffold_cleanup(content, facts) ⇒ Object @@ -36890,33 +53415,19 @@

     
     
    -7902
    -7903
    -7904
    -7905
    -7906
    -7907
    -7908
    -7909
    -7910
    -7911
    -7912
    -7913
    +4606 +4607 +4608 +4609 +4610

    @@ -36924,41 +53435,52 @@

    -

    +

    - .opencollective_org_env(env) ⇒ Object + .rakefile_scaffold_cleanup_recipe?(recipe) ⇒ Boolean -

    +
     
    -  opencollective_org_file(project_root)
    +
    +14045
    +14046
    +14047
    +14048
    +14049
    +14050
    +14051
    +14052
    +14053
    +14054
    +14055
    +14056
    +
    +
    # File 'lib/kettle/jem.rb', line 14045
    +
    +def rakefile_require_records(content)
    +  top_level_ruby_call_records(content, :require).filter_map do |call|
    +    name = ruby_string_argument(call)
    +    next unless name
    +
    +    {
    +      name: name,
    +      start_line: call.location.start_line,
    +      end_line: ruby_node_source_end_line(call)
    +    }
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 7902
    -
    -def opencollective_org_config(config)
    -  funding = config["funding"]
    -  return unless funding.is_a?(Hash) && funding.key?("open_collective")
    +      
    # File 'lib/kettle/jem.rb', line 4606
     
    -  value = funding["open_collective"]
    -  return if value == true || falsey_config?(value)
    -
    -  org = value.to_s.strip
    -  return if org.empty?
    +def rakefile_scaffold_cleanup(content, facts)
    +  return {content: content.to_s, delete_selectors: []} if facts[:template_profile].to_s == MONOREPO_ROOT_TEMPLATE_PROFILE
     
    -  {org: org, source: "config.funding.open_collective"}
    +  delete_rakefile_scaffold(content)
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -36966,9 +53488,9 @@

    -

    +

    - .opencollective_org_file(project_root) ⇒ Object + .rakefile_scaffold_delete_selectors(content) ⇒ Object @@ -36980,33 +53502,73 @@

     
     
    -7925
    -7926
    -7927
    -7928
    -7929
    -7930
    -7931
    -7932
    -7933
    -7934
    -7935
    -7936
    +14012 +14013 +14014 +14015 +14016 +14017 +14018 +14019 +14020 +14021 +14022 +14023 +14024 +14025 +14026 +14027 +14028 +14029 +14030 +14031 +14032 +14033 +14034 +14035 +14036 +14037 +14038 +14039 +14040 +14041 +14042 +14043

    @@ -37014,9 +53576,9 @@

    -

    +

    - .opencollective_org_github_funding_file(project_root) ⇒ Object + .rakefile_selector(selector_id, start_line, end_line, reason) ⇒ Object @@ -37028,33 +53590,27 @@

     
     
    -7938
    -7939
    -7940
    -7941
    -7942
    -7943
    -7944
    -7945
    -7946
    -7947
    -7948
    -7949
    +14130 +14131 +14132 +14133 +14134 +14135 +14136 +14137 +14138

    @@ -37062,9 +53618,9 @@

    -

    +

    - .opencollective_policy(config, env) ⇒ Object + .rakefile_task_block_selectors(content) ⇒ Object @@ -37076,49 +53632,33 @@

     
     
    -7858
    -7859
    -7860
    -7861
    -7862
    -7863
    -7864
    -7865
    -7866
    -7867
    -7868
    -7869
    -7870
    -7871
    -7872
    -7873
    -7874
    -7875
    -7876
    -7877
    +14071 +14072 +14073 +14074 +14075 +14076 +14077 +14078 +14079 +14080 +14081 +14082

    @@ -37126,9 +53666,9 @@

    -

    +

    - .opt_in_workflow_cleanup_files(project_root, template_selection) ⇒ Object + .rakefile_task_class_records(content) ⇒ Object @@ -37140,22 +53680,32 @@

     
     
    -7522
    -7523
    -7524
    -7525
    -7526
    -7527
    -7528
    +14058 +14059 +14060 +14061 +14062 +14063 +14064 +14065 +14066 +14067 +14068 +14069

    @@ -37164,39 +53714,62 @@

    -

    +

    - .packaged_gemfile_template_ruby_floor(target_path) ⇒ Object + .rakefile_template_default_task?(content, record) ⇒ Boolean -

     
     
    -7915
    -7916
    -7917
    -7918
    -7919
    -7920
    -7921
    -7922
    -7923
    +4602 +4603 +4604
    -
    # File 'lib/kettle/jem.rb', line 7915
    +      
    # File 'lib/kettle/jem.rb', line 4602
     
    -def opencollective_org_env(env)
    -  %w[OPENCOLLECTIVE_HANDLE FUNDING_ORG].each do |key|
    -    value = env[key].to_s.strip
    -    next if value.empty? || falsey_config?(value)
    -
    -    return {org: value, source: "env.#{key}"}
    -  end
    -  nil
    +def rakefile_scaffold_cleanup_recipe?(recipe)
    +  recipe.fetch(:name) == "rakefile_scaffold_cleanup"
     end
    -
    # File 'lib/kettle/jem.rb', line 7925
    +      
    # File 'lib/kettle/jem.rb', line 14012
     
    -def opencollective_org_file(project_root)
    -  path = File.join(project_root, ".opencollective.yml")
    -  return unless File.exist?(path)
    +def rakefile_scaffold_delete_selectors(content)
    +  selectors = []
     
    -  config = YAML.safe_load_file(path, permitted_classes: [], aliases: false) || {}
    -  return unless config.is_a?(Hash)
    +  rakefile_require_records(content).each do |record|
    +    selector_id = case record.fetch(:name)
    +    when "bundler/gem_tasks"
    +      "rakefile_scaffold_require_bundler_gem_tasks"
    +    when "rspec/core/rake_task"
    +      "rakefile_scaffold_require_rspec_core_rake_task"
    +    when "rubocop/rake_task"
    +      "rakefile_scaffold_require_rubocop_rake_task"
    +    end
    +    next unless selector_id
     
    -  org = config.fetch("collective", config["org"]).to_s.strip
    -  return if org.empty?
    +    selectors << rakefile_selector(selector_id, record.fetch(:start_line), record.fetch(:end_line), "wrapper_selected_scaffold_require")
    +  end
     
    -  {org: org, source: ".opencollective.yml"}
    +  rakefile_task_class_records(content).each do |record|
    +    selector_id = case record.fetch(:receiver)
    +    when "RSpec::Core::RakeTask"
    +      "rakefile_scaffold_rspec_task"
    +    when "RuboCop::RakeTask"
    +      "rakefile_scaffold_rubocop_task"
    +    end
    +    next unless selector_id
    +
    +    selectors << rakefile_selector(selector_id, record.fetch(:start_line), record.fetch(:end_line), "wrapper_selected_scaffold_task")
    +  end
    +
    +  selectors.concat(rakefile_task_block_selectors(content))
    +  selectors.sort_by { |selector| [selector.fetch(:start_line), selector.fetch(:end_line)] }
     end
    -
    # File 'lib/kettle/jem.rb', line 7938
    -
    -def opencollective_org_github_funding_file(project_root)
    -  path = File.join(project_root, ".github", "FUNDING.yml")
    -  return unless File.exist?(path)
    -
    -  funding = YAML.safe_load_file(path, permitted_classes: [], aliases: false) || {}
    -  return unless funding.is_a?(Hash)
    -
    -  org = Array(funding["open_collective"]).map(&:to_s).map(&:strip).reject(&:empty?).first
    -  return unless org
    +      
    # File 'lib/kettle/jem.rb', line 14130
     
    -  {org: org.delete_prefix("@"), source: ".github/FUNDING.yml"}
    +def rakefile_selector(selector_id, start_line, end_line, reason)
    +  {
    +    selector_id: selector_id,
    +    selector_family: "structural_owner_range",
    +    start_line: start_line,
    +    end_line: end_line,
    +    reason: reason
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 7858
    -
    -def opencollective_policy(config, env)
    -  funding = config["funding"]
    -  if funding.is_a?(Hash) && funding.key?("open_collective")
    -    config_value = funding["open_collective"]
    -    return {
    -      disabled: falsey_config?(config_value),
    -      source: "config.funding.open_collective",
    -      value: config_value.to_s
    -    }
    -  end
    +      
    # File 'lib/kettle/jem.rb', line 14071
     
    -  env_falsey = opencollective_falsey_env(env)
    -  return {disabled: true, source: "env.#{env_falsey.fetch(:key)}", value: env_falsey.fetch(:value).to_s} if env_falsey
    +def rakefile_task_block_selectors(content)
    +  rakefile_default_task_records(content).filter_map do |record|
    +    next if rakefile_template_default_task?(content, record)
     
    -  if config.dig("templates", "profile").to_s == MONOREPO_SUBGEM_TEMPLATE_PROFILE
    -    return {disabled: true, source: "config.templates.profile", value: MONOREPO_SUBGEM_TEMPLATE_PROFILE}
    +    rakefile_selector(
    +      "rakefile_scaffold_task_default",
    +      record.fetch(:start_line),
    +      record.fetch(:end_line),
    +      "wrapper_selected_scaffold_task"
    +    )
       end
    -
    -  {disabled: false}
     end
    -
    # File 'lib/kettle/jem.rb', line 7522
    +      
    # File 'lib/kettle/jem.rb', line 14058
     
    -def opt_in_workflow_cleanup_files(project_root, template_selection)
    -  include_patterns = Array(template_selection[:include])
    -  OPT_IN_GITHUB_WORKFLOWS.select do |relative_path|
    -    File.exist?(File.join(project_root, relative_path)) &&
    -      !selected_template_path?(relative_path, include_patterns)
    +def rakefile_task_class_records(content)
    +  top_level_ruby_call_records(content, :new).filter_map do |call|
    +    receiver = call.receiver&.slice
    +    next unless %w[RSpec::Core::RakeTask RuboCop::RakeTask].include?(receiver)
    +
    +    {
    +      receiver: receiver,
    +      start_line: call.location.start_line,
    +      end_line: ruby_node_source_end_line(call)
    +    }
       end
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -37204,9 +53777,9 @@

    -

    +

    - .packaged_template_rootObject + .rbs_merge_options(recipe) ⇒ Object @@ -37218,15 +53791,33 @@

     
     
    -1938
    -1939
    -1940
    +7200 +7201 +7202 +7203 +7204 +7205 +7206 +7207 +7208 +7209 +7210 +7211

    @@ -37234,9 +53825,9 @@

    -

    +

    - .paperclip_ref(name) ⇒ Object + .read_project_file(project_root, relative_path) ⇒ Object @@ -37248,29 +53839,17 @@

     
     
    -9774
    -9775
    -9776
    -9777
    -9778
    -9779
    -9780
    -9781
    -9782
    -9783
    +11727 +11728 +11729 +11730

    @@ -37278,9 +53857,9 @@

    -

    +

    - .parse_blame_porcelain(output, author_map) ⇒ Object + .read_project_files(project_root, pack) ⇒ Object @@ -37292,68 +53871,22 @@

     
     
    -8299
    -8300
    -8301
    -8302
    -8303
    -8304
    -8305
    -8306
    -8307
    -8308
    -8309
    -8310
    -8311
    -8312
    -8313
    -8314
    -8315
    -8316
    -8317
    -8318
    -8319
    -8320
    -8321
    -8322
    -8323
    -8324
    -8325
    -8326
    -8327
    -8328
    +4850 +4851 +4852 +4853 +4854 +4855 +4856

    @@ -37362,9 +53895,9 @@

    -

    +

    - .phase_for_recipe(recipe_name, relative_path) ⇒ Object + .readme_config_hash(config) ⇒ Object @@ -37376,41 +53909,17 @@

     
     
    -7780
    -7781
    -7782
    -7783
    -7784
    -7785
    -7786
    -7787
    -7788
    -7789
    -7790
    -7791
    -7792
    -7793
    -7794
    -7795
    +12024 +12025 +12026 +12027

    @@ -37418,9 +53927,9 @@

    -

    +

     
     
    -7759
    -7760
    -7761
    -7762
    -7763
    -7764
    -7765
    -7766
    -7767
    -7768
    -7769
    -7770
    -7771
    -7772
    -7773
    -7774
    +12421 +12422 +12423 +12424 +12425 +12426 +12427 +12428 +12429 +12430 +12431 +12432 +12433

     
     
    -10591
    -10592
    -10593
    -10594
    -10595
    -10596
    -10597
    -10598
    +14107 +14108 +14109 +14110 +14111 +14112 +14113 +14114
    -
    # File 'lib/kettle/jem.rb', line 10591
    +      
    # File 'lib/kettle/jem.rb', line 14107
     
    -def packaged_gemfile_template_ruby_floor(target_path)
    -  path = target_path.to_s
    -  if (match = path.match(%r{\Agemfiles/ruby_(\d+)_(\d+)\.gemfile\z}))
    -    return "#{match[1]}.#{match[2]}"
    -  end
    +def rakefile_template_default_task?(content, record)
    +  desc_lines = top_level_ruby_call_records(content, :desc).filter_map do |call|
    +    next unless ruby_string_argument(call) == "Default tasks aggregator"
     
    -  path[%r{(?:\A|/)r(\d+\.\d+)(?:/|\z)}, 1]
    +    call.location.start_line
    +  end
    +  desc_lines.include?(previous_nonblank_line_number(content, record.fetch(:start_line)))
     end
    -
    # File 'lib/kettle/jem.rb', line 1938
    +      
    # File 'lib/kettle/jem.rb', line 7200
     
    -def packaged_template_root
    -  PACKAGED_TEMPLATE_ROOT
    +def rbs_merge_options(recipe)
    +  options = {
    +    preference: (recipe.dig(:template_preference, :preference) || "destination").to_sym,
    +    add_template_only_nodes: true,
    +    freeze_token: recipe.dig(:template_preference, :freeze_token) || "kettle-jem"
    +  }
    +  if !recipe.dig(:template_preference, :add_template_only_nodes).nil?
    +    configured = DecisionPolicy.value_to_boolean(recipe.dig(:template_preference, :add_template_only_nodes))
    +    options[:add_template_only_nodes] = configured unless configured.nil?
    +  end
    +  options
     end
    -
    # File 'lib/kettle/jem.rb', line 9774
    +      
    # File 'lib/kettle/jem.rb', line 11727
     
    -def paperclip_ref(name)
    -  {
    -    copyright_notice_explainer: "\u{1F4C4}copyright-notice-explainer",
    -    license: "\u{1F4C4}license",
    -    license_ref: "\u{1F4C4}license-ref",
    -    license_img: "\u{1F4C4}license-img",
    -    license_compat: "\u{1F4C4}license-compat",
    -    license_compat_img: "\u{1F4C4}license-compat-img"
    -  }.fetch(name)
    +def read_project_file(project_root, relative_path)
    +  path = File.join(project_root, relative_path)
    +  File.file?(path) ? File.read(path) : ""
     end
    -
    # File 'lib/kettle/jem.rb', line 8299
    -
    -def parse_blame_porcelain(output, author_map)
    -  commit_meta = {}
    -  current_sha = nil
    -  current_name = nil
    -  current_email = nil
    -  current_time = nil
    -  output.to_s.each_line do |raw_line|
    -    line = raw_line.chomp
    -    if line.match?(/\A[0-9a-f]{40}\s/)
    -      current_sha = line[0, 40]
    -      meta = commit_meta[current_sha]
    -      current_name = meta && meta[:name]
    -      current_email = meta && meta[:email]
    -      current_time = meta && meta[:time]
    -    elsif line.start_with?("author ") && !commit_meta.key?(current_sha.to_s)
    -      current_name = line[7..].strip
    -    elsif line.start_with?("author-mail ") && !commit_meta.key?(current_sha.to_s)
    -      current_email = line[12..].strip.gsub(/[<>]/, "")
    -    elsif line.start_with?("author-time ") && !commit_meta.key?(current_sha.to_s)
    -      current_time = line[12..].strip.to_i
    -    elsif line.start_with?("filename ")
    -      next unless current_sha && current_email
    +      
    # File 'lib/kettle/jem.rb', line 4850
     
    -      commit_meta[current_sha] ||= {name: current_name, email: current_email, time: current_time}
    -      year = current_time&.positive? ? Time.at(current_time).utc.year.to_s : Time.now.utc.year.to_s
    -      author_map[current_email][:name] ||= current_name
    -      author_map[current_email][:years] << year
    -    end
    +def read_project_files(project_root, pack)
    +  pack.fetch(:recipes).to_h do |recipe|
    +    relative_path = recipe.fetch(:target_path)
    +    path = File.join(project_root, relative_path)
    +    [relative_path, File.exist?(path) ? File.read(path) : ""]
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 7780
    -
    -def phase_for_recipe(recipe_name, relative_path)
    -  path = relative_path.to_s
    -  name = recipe_name.to_s
    -  return :config_sync if path == KETTLE_CONFIG_PATH || path == LEGACY_KETTLE_CONFIG_PATH || name.include?("kettle_config")
    -  return :dev_container if path.start_with?(".devcontainer/")
    -  return :github_workflows if path.start_with?(".github/workflows/") || path == ".github/FUNDING.yml"
    -  return :modular_gemfiles if path.start_with?("gemfiles/modular/")
    -  return :spec_helper if path == "spec/spec_helper.rb" || path.start_with?("spec/support/")
    -  return :environment_templates if path.start_with?(".env") || path.end_with?(".env")
    -  return :git_hooks if path.start_with?(".git/hooks/", "git-hooks/")
    -  return :license_files if path.start_with?("LICENSE", "NOTICE") || managed_license_template_basename(path)
    -  return :duplicate_check if name.include?("duplicate")
    -  return :quality_config if quality_config_path?(path)
    +      
    # File 'lib/kettle/jem.rb', line 12024
     
    -  :remaining_files
    +def readme_config_hash(config)
    +  raw_config = config.is_a?(Hash) ? config["readme"] : nil
    +  raw_config.is_a?(Hash) ? raw_config : {}
     end
    -
    # File 'lib/kettle/jem.rb', line 7759
    +      
    # File 'lib/kettle/jem.rb', line 12421
     
    -def phase_reports_for(recipe_reports)
    -  reports_by_phase = recipe_reports.group_by { |recipe_report| recipe_report_phase(recipe_report) }
    -  PHASE_ORDER.map do |phase|
    -    reports = reports_by_phase.fetch(phase, [])
    -    changed_reports = reports.select { |recipe_report| recipe_report[:changed] }
    -    {
    -      phase: phase.to_s,
    -      recipes: reports.map { |recipe_report| recipe_report[:recipe_name] }.compact,
    -      changed_files: changed_reports.map { |recipe_report| recipe_report[:relative_path] }.compact.uniq.sort,
    -      stats: {
    -        recipe_count: reports.length,
    -        changed_count: changed_reports.length
    -      }
    -    }
    -  end
    -end
    +def readme_copyright_notice(copyright_lines, copyright_prefix, author) + lines = copyright_notice_lines(copyright_lines, copyright_prefix, author).map { |line| "- #{line}" } + <<~MARKDOWN.chomp + See [LICENSE.md][#{paperclip_ref(:license)}] for the official copyright notice. + + <details markdown="1"> + <summary>Copyright holders</summary> + + #{lines.join("\n")} + + </details> + MARKDOWN +end
    -

    +

    - .plan_project(project_root, env: ENV, run_options: {}) ⇒ Object + .readme_default_logo_width(entries, one:, two:) ⇒ Object @@ -37488,99 +53991,25 @@

     
     
    -3057
    -3058
    -3059
    -3060
    -3061
    -3062
    -3063
    -3064
    -3065
    -3066
    -3067
    -3068
    -3069
    -3070
    -3071
    -3072
    -3073
    -3074
    -3075
    -3076
    -3077
    -3078
    -3079
    -3080
    -3081
    -3082
    -3083
    -3084
    -3085
    -3086
    -3087
    -3088
    -3089
    -3090
    -3091
    -3092
    -3093
    -3094
    -3095
    -3096
    -3097
    -3098
    -3099
    -3100
    -3101
    +12228 +12229 +12230 +12231 +12232 +12233 +12234 +12235

    -
    # File 'lib/kettle/jem.rb', line 3057
    +      
    # File 'lib/kettle/jem.rb', line 12228
     
    -def plan_project(project_root, env: ENV, run_options: {})
    -  preflight_project!(project_root)
    -  template_selection = template_selection_for(env, run_options)
    -  decision_policy = decision_policy_for(env, run_options)
    -  git_preflight = git_preflight_report(project_root, template_selection: template_selection)
    -  enforce_git_preflight!(git_preflight, decision_policy: decision_policy, template_selection: template_selection)
    -  facts = discover_facts(project_root, env: env, run_options: run_options)
    -  pack = recipe_pack(facts)
    -  pack = filter_recipe_pack(pack, template_selection)
    -  files = read_project_files(project_root, pack)
    -  recipe_reports = pack.fetch(:recipes).map do |recipe|
    -    execute_recipe(project_root: project_root, recipe: recipe, facts: facts, files: files, decision_policy: decision_policy, env: env)
    -  end
    -  plugin_registry = plugin_registry_for_project(project_root)
    -  changed_files = changed_files_from_recipe_reports(recipe_reports)
    -  diagnostics = recipe_reports.flat_map { |report| report[:diagnostics] }
    -  phase_reports = phase_reports_for(recipe_reports)
    -  decision_evaluations = recipe_reports.map { |report| report.fetch(:decision_evaluation) }
    -  prompt_requests = decision_evaluations.filter_map { |decision| decision[:prompt] if decision[:prompt_required] }
    -  unless plugin_registry.configured_plugins.empty?
    -    diagnostics << plugin_lifecycle_diagnostic(
    -      plugin_registry,
    -      callbacks_run: false,
    -      active_runner_phases: []
    -    )
    +def readme_default_logo_width(entries, one:, two:)
    +  case entries.length
    +  when 1
    +    one
    +  when 2
    +    two
       end
    -  run_stats = recipe_run_stats(recipe_reports, diagnostics: diagnostics)
    -
    -  {
    -    mode: "plan",
    -    ready: true,
    -    facts: facts,
    -    recipe_pack: pack,
    -    recipe_reports: recipe_reports,
    -    phase_reports: phase_reports,
    -    decision_policy: decision_policy.to_h,
    -    template_selection: template_selection,
    -    git_preflight: git_preflight,
    -    decision_evaluations: decision_evaluations,
    -    prompt_requests: prompt_requests,
    -    changed_files: changed_files,
    -    diagnostics: diagnostics,
    -    run_stats: run_stats
    -  }
     end
    -
    # File 'lib/kettle/jem.rb', line 3456
    +      
    # File 'lib/kettle/jem.rb', line 12938
     
    -def plan_readme_style(project_root, env: ENV)
    -  facts = discover_facts(project_root, env: env)
    -  config = kettle_jem_config(project_root)
    -  readme_style = facts[:readme_style] ||
    -    readme_style_facts(
    -      project_root,
    -      config,
    -      facts.fetch(:license, {}),
    -      template_profile: facts[:template_profile],
    -      repository: facts[:repository]
    -    )
    -  original_path = File.join(project_root, "README.md")
    -  original = File.exist?(original_path) ? File.read(original_path) : ""
    -  final_content = render_thin_readme(facts, readme_style, original, readme_preserve_config(config))
    +def readme_destination_front_sections(destination_content)
    +  sections = markdown_sections(destination_content)
    +  h1 = sections.find { |section| section.fetch(:level) == 1 }
    +  synopsis = sections.find { |section| section.fetch(:level) == 2 && section.fetch(:base) == "synopsis" }
    +  return [] unless h1 && synopsis
     
    -  {
    -    mode: "plan",
    -    readme_path: "README.md",
    -    changed: final_content != original,
    -    readme_style: readme_style,
    -    final_content: final_content,
    -    diagnostics: []
    -  }
    +  sections.select do |section|
    +    section.fetch(:level) == 2 &&
    +      section.fetch(:start) > h1.fetch(:start) &&
    +      section.fetch(:end) < synopsis.fetch(:start) &&
    +      readme_front_section_preserved?(section)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 7677
    +      
    # File 'lib/kettle/jem.rb', line 10366
     
    -def plugin_lifecycle_diagnostic(plugin_registry, callbacks_run:, active_runner_phases:)
    -  {
    -    kind: "plugin_lifecycle",
    -    configured_plugins: plugin_registry.configured_plugins,
    -    loaded_plugins: plugin_registry.loaded_plugins,
    -    load_errors: plugin_registry.load_errors,
    -    registered_hooks: plugin_registry.hooks.map do |hook|
    -      {
    -        plugin_name: hook.plugin_name,
    -        phase: hook.phase.to_s,
    -        timing: hook.timing.to_s
    -      }
    -    end,
    -    callbacks_run: callbacks_run,
    -    active_runner_phases: active_runner_phases.map(&:to_s)
    -  }
    +def readme_dev_test_stack_table(package_name)
    +  rows = README_DEV_TEST_STACK_GEMS.reject { |gem| gem.fetch(:name) == package_name.to_s }.map do |gem|
    +    name = gem.fetch(:name)
    +    bestgems_url = "https://bestgems.org/gems/#{name}"
    +    badge_url = "https://img.shields.io/gem/rd/#{name}.svg?style=flat-square"
    +    [
    +      "| [#{name}](#{bestgems_url})",
    +      "[GitHub](#{gem.fetch(:repo)})",
    +      gem.fetch(:role),
    +      "[![Daily download rank for #{name}](#{badge_url})](#{bestgems_url}) |"
    +    ].join(" | ")
    +  end
    +
    +  [
    +    '<details markdown="1">',
    +    "<summary>How kettle-dev manages complexity in tests</summary>",
    +    "",
    +    "| Gem | Source | Role | Daily download rank |",
    +    "|-----|--------|------|---------------------|",
    +    *rows,
    +    "",
    +    "</details>"
    +  ].join("\n")
    +end
    +
    +
    + +
    +

    + + .readme_disabled_integrations(readme, integration_disabled: []) ⇒ Object + + + + + +

    + + + @@ -37718,9 +54185,9 @@

    -

    +

    - .plugin_names_from_config(config) ⇒ Object + .readme_extra_preserved_sections_by_anchor(destination_sections, template_bases, preserve_targets) ⇒ Object @@ -37732,30 +54199,40 @@

     
     
    -7665
    -7666
    -7667
    -7668
    -7669
    -7670
    -7671
    -7672
    -7673
    -7674
    -7675
    +12994 +12995 +12996 +12997 +12998 +12999 +13000 +13001 +13002 +13003 +13004 +13005 +13006 +13007 +13008 +13009

    @@ -37764,9 +54241,9 @@

    -

    +

    - .plugin_registry_for_project(project_root) ⇒ Object + .readme_family_intro_and_backend_matrix(readme_style = {}) ⇒ Object @@ -37778,37 +54255,51 @@

     
     
    -7650
    -7651
    -7652
    -7653
    -7654
    -7655
    -7656
    -7657
    -7658
    -7659
    -7660
    -7661
    -7662
    -7663
    +10551 +10552 +10553 +10554 +10555 +10556 +10557 +10558 +10559 +10560 +10561 +10562 +10563 +10564 +10565 +10566 +10567 +10568 +10569 +10570 +10571

    @@ -37816,9 +54307,9 @@

    -

    +

    - .polyform_licenses?(licenses) ⇒ Boolean + .readme_floss_funding_enabled?(license, config_value) ⇒ Boolean @@ -37853,15 +54344,21 @@

     
     
    -9728
    -9729
    -9730
    +12775 +12776 +12777 +12778 +12779 +12780

    @@ -37869,9 +54366,9 @@

    -

    +

    - .post_apply_steps(project_root, report) ⇒ Object + .readme_fossa_project(readme, repository) ⇒ Object @@ -37883,23 +54380,51 @@

     
     
    -3151
    -3152
    -3153
    -3154
    -3155
    -3156
    -3157
    +12704 +12705 +12706 +12707 +12708 +12709 +12710 +12711 +12712 +12713 +12714 +12715 +12716 +12717 +12718 +12719 +12720 +12721 +12722 +12723 +12724

    @@ -37907,9 +54432,9 @@

    -

    +

    - .postprocess_readme_content(content, facts, project_root: nil) ⇒ Object + .readme_fossa_template_tokens(readme_style) ⇒ Object @@ -37921,47 +54446,35 @@

     
     
    -4376
    -4377
    -4378
    -4379
    -4380
    -4381
    -4382
    -4383
    -4384
    -4385
    -4386
    -4387
    -4388
    -4389
    -4390
    -4391
    -4392
    -4393
    -4394
    +10401 +10402 +10403 +10404 +10405 +10406 +10407 +10408 +10409 +10410 +10411 +10412 +10413

    @@ -37969,83 +54482,52 @@

    -

    +

    - .preferred_template_source(template_root, configured_source, opencollective_disabled: false) ⇒ Object + .readme_front_section_preserved?(section) ⇒ Boolean -

    +
    +
    +
    +12782
    +12783
    +12784
    +12785
    +12786
    +12787
    +12788
    +12789
    +12790
    +12791
    +12792
    +
    +
    # File 'lib/kettle/jem.rb', line 12782
    +
    +def readme_disabled_integrations(readme, integration_disabled: [])
    +  disabled = []
    +  disabled.concat(Array(integration_disabled).map(&:to_s))
    +  integrations = readme["integrations"].is_a?(Hash) ? readme["integrations"] : {}
    +  badges = readme["badges"].is_a?(Hash) ? readme["badges"] : {}
    +  integrations.each do |name, value|
    +    disabled << name.to_s if falsey_config?(value)
    +  end
    +  disabled.concat(Array(badges["disabled"]).map(&:to_s))
    +  disabled.map { |name| normalize_integration_name(name) }.uniq & README_INTEGRATIONS
     end
    -
    # File 'lib/kettle/jem.rb', line 7665
    +      
    # File 'lib/kettle/jem.rb', line 12994
     
    -def plugin_names_from_config(config)
    -  raw = config.is_a?(Hash) ? config["plugins"] : nil
    -  case raw
    -  when Hash
    -    raw.each_with_object([]) do |(name, enabled), names|
    -      names << name unless falsey_config?(enabled)
    +def readme_extra_preserved_sections_by_anchor(destination_sections, template_bases, preserve_targets)
    +  destination_sections.each_with_index.each_with_object({}) do |(section, index), result|
    +    base = section.fetch(:base)
    +    next if template_bases.include?(base)
    +    next unless preserve_targets.include?(base)
    +    next if readme_section_has_preserved_ancestor?(destination_sections, index, preserve_targets)
    +
    +    anchor = destination_sections[0...index].reverse.find do |candidate|
    +      template_bases.include?(candidate.fetch(:base))
         end
    -  else
    -    raw
    +    next unless anchor
    +
    +    result[anchor.fetch(:base)] ||= []
    +    result[anchor.fetch(:base)] << section
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 7650
    +      
    # File 'lib/kettle/jem.rb', line 10551
     
    -def plugin_registry_for_project(project_root)
    -  plugin_names = PluginLoader.normalize_plugin_names(plugin_names_from_config(kettle_jem_config(project_root)))
    -  registry = PluginRegistry.new(configured_plugins: plugin_names)
    -  plugin_names.each do |plugin_name|
    -    PluginLoader.load_plugin!(plugin_name, registry: registry)
    -    registry.loaded_plugins << plugin_name
    -  rescue Error => e
    -    registry.load_errors << {
    -      plugin_name: plugin_name,
    -      message: e.message
    -    }
    -  end
    -  registry
    +def readme_family_intro_and_backend_matrix(readme_style = {})
    +  return "" unless readme_style.is_a?(Hash) && readme_style[:package_family].to_s == "structuredmerge"
    +
    +  [
    +    "<details markdown=\"1\">",
    +    "<summary>StructuredMerge package family</summary>",
    +    "",
    +    "This gem is part of the StructuredMerge Ruby package family. The implementation inventory, layering model, and backend notes live in the [root package-family guide][sm-family-guide]. Shared behavior is defined by the [StructuredMerge fixtures][sm-family-fixtures] and implemented by the [Go][sm-family-go], [Ruby][sm-family-ruby], [Rust][sm-family-rust], and [TypeScript][sm-family-typescript] repositories.",
    +    "",
    +    "Merge analysis must enter parsing through `tree_haver`. Parser-specific gems register concrete TreeHaver backends; substrate gems register grammar mappings and keep shared format or language merge behavior in one place. Missing backends fail closed instead of falling back to direct parser-library calls.",
    +    "",
    +    "</details>",
    +    "",
    +    "[sm-family-guide]: https://github.com/structuredmerge/structuredmerge-ruby#package-family",
    +    "[sm-family-fixtures]: https://github.com/structuredmerge/structuredmerge-fixtures",
    +    "[sm-family-go]: https://github.com/structuredmerge/structuredmerge-go",
    +    "[sm-family-ruby]: https://github.com/structuredmerge/structuredmerge-ruby",
    +    "[sm-family-rust]: https://github.com/structuredmerge/structuredmerge-rust",
    +    "[sm-family-typescript]: https://github.com/structuredmerge/structuredmerge-typescript"
    +  ].join("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 9728
    +      
    # File 'lib/kettle/jem.rb', line 12775
     
    -def polyform_licenses?(licenses)
    -  licenses.any? { |license| license.to_s.start_with?("PolyForm-") }
    +def readme_floss_funding_enabled?(license, config_value)
    +  return false if falsey_config?(config_value)
    +  return true if %w[true yes 1 always enabled].include?(config_value.to_s.strip.downcase)
    +
    +  Array(license[:spdx]).map(&:to_s).include?("MIT")
     end
    -
    # File 'lib/kettle/jem.rb', line 3151
    +      
    # File 'lib/kettle/jem.rb', line 12704
     
    -def post_apply_steps(project_root, report)
    -  [
    -    template_version_gem_bootstrap_step(project_root, report),
    -    monorepo_root_gemfile_dependency_sync_step(project_root, report),
    -    monorepo_subgem_kettle_config_profile_sync_step(project_root, report)
    -  ].compact
    +def readme_fossa_project(readme, repository)
    +  badges = readme["badges"].is_a?(Hash) ? readme["badges"] : {}
    +  return "" unless badges.key?("fossa")
    +
    +  value = badges["fossa"]
    +  return "" if falsey_config?(value)
    +
    +  project = case value
    +  when Hash
    +    return "" if falsey_config?(value["enabled"])
    +
    +    value["project"] || value["project_id"] || value["slug"]
    +  else
    +    value
    +  end
    +  normalized = project.to_s.strip
    +  return normalized unless normalized.empty? || %w[true yes 1 on enabled].include?(normalized.downcase)
    +
    +  slug = repository.is_a?(Hash) ? repository[:slug].to_s : ""
    +  slug.empty? ? "" : "git+github.com/#{slug}"
     end
    -
    # File 'lib/kettle/jem.rb', line 4376
    +      
    # File 'lib/kettle/jem.rb', line 10401
     
    -def postprocess_readme_content(content, facts, project_root: nil)
    -  return content unless facts
    +def readme_fossa_template_tokens(readme_style)
    +  project = readme_style.fetch(:fossa_project, "").to_s
    +  return {"KJ|README:FOSSA_BADGE" => "", "KJ|README:FOSSA_REFS" => ""} if project.empty?
     
    -  processed = ReadmePostProcessor.process(
    -    content: content,
    -    min_ruby: minimum_ruby_token(facts.dig(:rubygems, :min_ruby)),
    -    engines: facts.dig(:rubygems, :engines)
    -  )
    -  processed = normalize_readme_project_heading(processed, facts)
    -  processed = normalize_readme_synopsis_heading(processed, facts)
    -  processed = apply_readme_conditional_blocks(processed, facts)
    -  processed = apply_readme_badge_policy(processed, facts)
    -  processed = prune_unused_readme_logo_link_definitions(processed)
    -  processed = apply_readme_kloc_badge(processed, facts, project_root)
    -  processed = apply_monorepo_subgem_thin_readme_projection(processed, facts)
    -  processed = apply_monorepo_subgem_readme_recipe(processed, facts)
    -  processed = replace_existing_markdown_managed_block(processed, "kettle-jem:metadata", (facts))
    -  normalize_readme_blank_line_runs(processed)
    +  encoded_project = URI.encode_www_form_component(project)
    +  {
    +    "KJ|README:FOSSA_BADGE" => README_FOSSA_BADGE,
    +    "KJ|README:FOSSA_REFS" => [
    +      "[🧪fossa]: https://app.fossa.com/projects/#{encoded_project}?ref=badge_shield",
    +      "[🧪fossa-img]: https://app.fossa.com/api/projects/#{encoded_project}.svg?type=shield"
    +    ].join("\n")
    +  }
     end
    - - - - -
    -
    -
    +
    +
    + -10652 -10653 -10654 -10655 -10656 -10657 -10658 -10659
    -
    -
    # File 'lib/kettle/jem.rb', line 10652
     
    -def preferred_template_source(template_root, configured_source, opencollective_disabled: false)
    -  base = configured_source.sub(/\.example\z/, "")
    -  candidates = []
    -  candidates << "#{base}.no-osc.example" if opencollective_disabled && base != "README.md"
    -  candidates << "#{base}.example"
    -  candidates << configured_source
    -  candidates.find { |relative_path| File.exist?(File.join(template_root, relative_path)) }
    -end
    -
    +
    - -
    -

    +
    - .preferred_template_token_value(derived_value, config_value, env, env_key) ⇒ Object +

    Returns:

    +
      - +
    • + + + (Boolean) + + + +
    • +
    - -

    +
    @@ -38053,9 +54535,9 @@

    -

    +

    - .preflight_project!(project_root) ⇒ Object + .readme_h2_synopsis_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object @@ -38067,21 +54549,23 @@

     
     
    -7558
    -7559
    -7560
    -7561
    -7562
    -7563
    +12069 +12070 +12071 +12072 +12073 +12074 +12075

    @@ -38089,9 +54573,9 @@

    -

    +

    - .preflight_ruby_syntax!(project_root, path) ⇒ Object + .readme_h2_synopsis_logo_options(config) ⇒ Object @@ -38103,31 +54587,15 @@

     
     
    -7594
    -7595
    -7596
    -7597
    -7598
    -7599
    -7600
    -7601
    -7602
    -7603
    -7604
    +11977 +11978 +11979

    @@ -38135,9 +54603,9 @@

    -

    +

    - .prepare_github_workflow_template(content, recipe, facts) ⇒ Object + .readme_h2_synopsis_logo_row(entries) ⇒ Object @@ -38149,21 +54617,21 @@

     
     
    -4341
    -4342
    -4343
    -4344
    -4345
    -4346
    +12221 +12222 +12223 +12224 +12225 +12226

    @@ -38171,9 +54639,9 @@

    -

    +

    - .prepare_readme_template(content, readme_style) ⇒ Object + .readme_h2_synopsis_logo_specs(config) ⇒ Object @@ -38185,43 +54653,49 @@

     
     
    -4683
    -4684
    -4685
    -4686
    -4687
    -4688
    -4689
    -4690
    -4691
    -4692
    -4693
    -4694
    -4695
    -4696
    -4697
    -4698
    -4699
    +11981 +11982 +11983 +11984 +11985 +11986 +11987 +11988 +11989 +11990 +11991 +11992 +11993 +11994 +11995 +11996 +11997 +11998 +11999 +12000

    @@ -38229,9 +54703,9 @@

    -

    +

    - .present_template_token_value?(value) ⇒ Boolean + .readme_integration_configured?(project_root, integration) ⇒ Boolean @@ -38266,17 +54740,59 @@

     
     
    -8205
    -8206
    -8207
    -8208
    +12859 +12860 +12861 +12862 +12863 +12864 +12865 +12866 +12867 +12868 +12869 +12870 +12871 +12872 +12873 +12874 +12875 +12876 +12877 +12878 +12879 +12880 +12881 +12882 +12883

    @@ -38284,9 +54800,9 @@

    -

    +

    - .preserve_gemspec_dependency_lines(template_content, destination_content, template_receiver:, destination_receiver:) ⇒ Object + .readme_integration_project_root(project_root, template_profile, repository) ⇒ Object @@ -38298,47 +54814,19 @@

     
     
    -6283
    -6284
    -6285
    -6286
    -6287
    -6288
    -6289
    -6290
    -6291
    -6292
    -6293
    -6294
    -6295
    -6296
    -6297
    -6298
    -6299
    -6300
    -6301
    +12726 +12727 +12728 +12729 +12730

    @@ -38346,9 +54834,9 @@

    -

    +

    - .preserve_gemspec_freeze_blocks(content, destination_content, facts:, receiver:) ⇒ Object + .readme_kloc_from_changelog(project_root, version) ⇒ Object @@ -38360,45 +54848,25 @@

     
     
    -6303
    -6304
    -6305
    -6306
    -6307
    -6308
    -6309
    -6310
    -6311
    -6312
    -6313
    -6314
    -6315
    -6316
    -6317
    -6318
    -6319
    -6320
    +5130 +5131 +5132 +5133 +5134 +5135 +5136 +5137 -

    @@ -38406,9 +54874,9 @@

    -

    +

    - .preserve_github_workflow_project_settings(recipe, content, destination_content, project_root:) ⇒ Object + .readme_license_intro(licenses, author_email: nil) ⇒ Object @@ -38420,31 +54888,31 @@

    -4348 -4349 -4350 -4351 -4352 -4353 -4354 -4355 -4356 -4357 -4358 +12456 +12457 +12458 +12459 +12460 +12461 +12462 +12463 +12464 +12465 +12466

    @@ -38452,9 +54920,9 @@

    -

    +

    - .preserve_mise_project_settings(recipe, content, destination_content, project_root:) ⇒ Object + .readme_license_refs(expression, compat_category) ⇒ Object @@ -38466,27 +54934,29 @@

     
     
    -4286
    -4287
    -4288
    -4289
    -4290
    -4291
    -4292
    -4293
    -4294
    +12485 +12486 +12487 +12488 +12489 +12490 +12491 +12492 +12493 +12494

    @@ -38494,9 +54964,9 @@

    -

    +

    - .preserve_readme_front_sections(template_content, destination_content) ⇒ Object + .readme_logo_config_value(spec) ⇒ Object @@ -38508,41 +54978,17 @@

     
     
    -9986
    -9987
    -9988
    -9989
    -9990
    -9991
    -9992
    -9993
    -9994
    -9995
    -9996
    -9997
    -9998
    -9999
    -10000
    -10001
    +8930 +8931 +8932 +8933

    @@ -38550,9 +54996,9 @@

    -

    +

    - .preserve_readme_h1(merged_content, destination_content, preserve_config) ⇒ Object + .readme_logo_facts(config, package_name:, github_org:, repository: {}) ⇒ Object @@ -38564,31 +55010,53 @@

     
     
    -10075
    -10076
    -10077
    -10078
    -10079
    -10080
    -10081
    -10082
    -10083
    -10084
    -10085
    +11950 +11951 +11952 +11953 +11954 +11955 +11956 +11957 +11958 +11959 +11960 +11961 +11962 +11963 +11964 +11965 +11966 +11967 +11968 +11969 +11970 +11971

    @@ -38596,9 +55064,9 @@

    -

    +

    - .preserve_readme_managed_block(merged_content, destination_content, marker) ⇒ Object + .readme_logo_html(entry, align:, width: nil) ⇒ Object @@ -38610,21 +55078,27 @@

     
     
    -10087
    -10088
    -10089
    -10090
    -10091
    -10092
    +12241 +12242 +12243 +12244 +12245 +12246 +12247 +12248 +12249

    @@ -38632,9 +55106,9 @@

    -

    +

    - .preserve_readme_sections(template_content, destination_content, preserve_config) ⇒ Object + .readme_logo_options_from_config(config, primary_key, secondary_key, defaults) ⇒ Object @@ -38646,75 +55120,15 @@

     
     
    -10025
    -10026
    -10027
    -10028
    -10029
    -10030
    -10031
    -10032
    -10033
    -10034
    -10035
    -10036
    -10037
    -10038
    -10039
    -10040
    -10041
    -10042
    -10043
    -10044
    -10045
    -10046
    -10047
    -10048
    -10049
    -10050
    -10051
    -10052
    -10053
    -10054
    -10055
    -10056
    -10057
    +12002 +12003 +12004

    @@ -38722,9 +55136,9 @@

    -

    +

    - .previous_nonblank_line_number(content, line_number) ⇒ Object + .readme_logo_specs_from_config(config, primary_key, secondary_key, defaults) ⇒ Object @@ -38736,21 +55150,43 @@

     
     
    -11075
    -11076
    -11077
    -11078
    -11079
    -11080
    +12006 +12007 +12008 +12009 +12010 +12011 +12012 +12013 +12014 +12015 +12016 +12017 +12018 +12019 +12020 +12021 +12022

    @@ -38758,9 +55194,9 @@

    -

    +

    - .prism_parse_success(content) ⇒ Object + .readme_logo_template_tokens(readme_logo) ⇒ Object @@ -38772,17 +55208,23 @@

     
     
    -5423
    -5424
    -5425
    -5426
    +12255 +12256 +12257 +12258 +12259 +12260 +12261

    @@ -38790,9 +55232,9 @@

    -

    +

    - .prism_ruby_merge_options(recipe) ⇒ Object + .readme_metadata_block(facts) ⇒ Object @@ -38804,23 +55246,53 @@

     
     
    -5135
    -5136
    -5137
    -5138
    -5139
    -5140
    -5141
    +13930 +13931 +13932 +13933 +13934 +13935 +13936 +13937 +13938 +13939 +13940 +13941 +13942 +13943 +13944 +13945 +13946 +13947 +13948 +13949 +13950 +13951

    @@ -38828,59 +55300,42 @@

    -

    - - .process_result_adapter_failure?(merge_result) ⇒ Boolean +

    - + .readme_metadata_license_expression(facts) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -8194
    -8195
    -8196
    -8197
    -8198
    -8199
    -8200
    -8201
    -8202
    -8203
    +12952 +12953 +12954
    -
    # File 'lib/kettle/jem.rb', line 8194
    -
    -def preferred_template_token_value(derived_value, config_value, env, env_key)
    -  env_clean = env[env_key].to_s.strip
    -  return env_clean if present_template_token_value?(env_clean)
    -
    -  config_clean = config_value.to_s.strip
    -  return config_clean if present_template_token_value?(config_clean)
    -  return unless present_template_token_value?(derived_value)
    +      
    # File 'lib/kettle/jem.rb', line 12952
     
    -  derived_value.to_s.strip
    +def readme_front_section_preserved?(section)
    +  section.fetch(:base) == "important" || readme_section_contains_badge_cloud?(section)
     end
    -
    # File 'lib/kettle/jem.rb', line 7558
    +      
    # File 'lib/kettle/jem.rb', line 12069
     
    -def preflight_project!(project_root)
    -  paths = Dir.glob(File.join(project_root, "*.gemspec")).sort
    -  gemfile_path = File.join(project_root, "Gemfile")
    -  paths << gemfile_path if File.exist?(gemfile_path)
    -  paths.each { |path| preflight_ruby_syntax!(project_root, path) }
    +def readme_h2_synopsis_logo_entries(config, org:, gem_name:, repository: {})
    +  entries = readme_h2_synopsis_logo_specs(config).filter_map do |spec|
    +    readme_top_logo_entry_from_option(spec.fetch(:type), org: org, gem_name: gem_name, repository: repository)&.merge(width: spec[:width])
    +  end
    +  entries = deduplicate_readme_top_logo_entries(entries)
    +  readme_top_logo_entries_with_asset_size(entries)
     end
    -
    # File 'lib/kettle/jem.rb', line 7594
    +      
    # File 'lib/kettle/jem.rb', line 11977
     
    -def preflight_ruby_syntax!(project_root, path)
    -  if defined?(RubyVM::InstructionSequence)
    -    RubyVM::InstructionSequence.compile_file(path)
    -  else
    -    _stdout, stderr, status = Open3.capture3(RbConfig.ruby, "-c", path)
    -    raise SyntaxError, stderr unless status.success?
    -  end
    -rescue SyntaxError => e
    -  relative_path = path.delete_prefix("#{project_root}/")
    -  raise Error, "Preflight failed for #{relative_path}: #{e.message}"
    +def readme_h2_synopsis_logo_options(config)
    +  readme_h2_synopsis_logo_specs(config).map { |spec| spec.fetch(:type) }
     end
    -
    # File 'lib/kettle/jem.rb', line 4341
    -
    -def prepare_github_workflow_template(content, recipe, facts)
    -  return content unless recipe.fetch(:target_path).to_s == ".github/workflows/framework-ci.yml"
    -  return content if facts.to_h.dig(:ci, :framework_matrix).to_h.empty?
    +      
    # File 'lib/kettle/jem.rb', line 12221
     
    -  synchronize_github_actions_framework_ci(content, facts)
    +def readme_h2_synopsis_logo_row(entries)
    +  default_width = readme_default_logo_width(entries, one: "10%", two: "8%")
    +  entries.map do |entry|
    +    readme_logo_html(entry, align: "right", width: entry[:width] || default_width)
    +  end.join(" ")
     end
    -
    # File 'lib/kettle/jem.rb', line 4683
    +      
    # File 'lib/kettle/jem.rb', line 11981
     
    -def prepare_readme_template(content, readme_style)
    -  style = readme_style || {}
    -  prepared = prune_readme_integration_badges(content, style)
    -  if style[:workflow_paths]
    -    prepared = ReadmePostProcessor.process(
    -      content: prepared,
    -      min_ruby: "0",
    -      workflow_paths: style[:workflow_paths]
    -    )
    +def readme_h2_synopsis_logo_specs(config)
    +  readme_config = readme_config_hash(config)
    +  h2_synopsis_logos = readme_config["h2_synopsis_logos"]
    +  normalized = normalized_readme_logo_specs(h2_synopsis_logos)
    +  return normalized unless normalized.empty?
    +
    +  raw_top_logos = readme_config["top_logos"] || readme_config["top_logo_options"]
    +  normalized_top_logos = normalized_readme_logo_specs(raw_top_logos)
    +  synopsis_from_top_logos = normalized_top_logos.select { |spec| README_H2_SYNOPSIS_LOGO_DEFAULTS.include?(spec.fetch(:type)) }
    +  return synopsis_from_top_logos unless synopsis_from_top_logos.empty?
    +
    +  legacy_mode = readme_config["top_logo_mode"].to_s.strip.downcase.tr("-", "_")
    +  legacy_options = README_TOP_LOGO_LEGACY_MODE_MAP[legacy_mode]
    +  synopsis_from_legacy = Array(legacy_options).filter_map do |option|
    +    {type: option, width: nil} if README_H2_SYNOPSIS_LOGO_DEFAULTS.include?(option)
       end
    -  prepared = prune_missing_workflow_link_definitions(prepared, style[:workflow_paths]) if style[:workflow_paths]
    -  prepared = ReadmePostProcessor.prune_orphaned_workflow_inline_references(prepared) if style[:workflow_paths]
    -  omitted_sections = Array(style[:omitted_sections]).map(&:to_s)
    -  omitted_sections << "security" if style.key?(:security_enabled) && !style[:security_enabled]
    -  omitted_sections << "floss_funding" if style.key?(:floss_funding_enabled) && !style[:floss_funding_enabled]
    -  remove_readme_sections(prepared, omitted_sections.map { |section| section.tr("_", " ") })
    +  return synopsis_from_legacy unless synopsis_from_legacy.empty?
    +
    +  raw_top_logos ? [] : README_H2_SYNOPSIS_LOGO_DEFAULTS.map { |option| {type: option, width: nil} }
     end
    -
    # File 'lib/kettle/jem.rb', line 8205
    +      
    # File 'lib/kettle/jem.rb', line 12859
     
    -def present_template_token_value?(value)
    -  clean = value.to_s.strip
    -  !clean.empty? && !token_placeholder?(clean)
    +def readme_integration_configured?(project_root, integration)
    +  case integration
    +  when "codecov"
    +    File.exist?(File.join(project_root, ".codecov.yml")) ||
    +      File.exist?(File.join(project_root, "codecov.yml")) ||
    +      github_workflows_include?(project_root, "codecov/codecov-action")
    +  when "coveralls"
    +    File.exist?(File.join(project_root, ".coveralls.yml")) ||
    +      github_workflows_include?(project_root, "coverallsapp/github-action")
    +  when "qlty"
    +    File.exist?(File.join(project_root, ".qlty/qlty.toml")) ||
    +      File.exist?(File.join(project_root, ".qlty.yml")) ||
    +      github_workflows_include?(project_root, "qltysh/qlty-action")
    +  when "codeql"
    +    File.exist?(File.join(project_root, ".github/workflows/codeql.yml")) ||
    +      File.exist?(File.join(project_root, ".github/workflows/codeql-analysis.yml")) ||
    +      github_workflows_include?(project_root, "github/codeql-action")
    +  when "skywalking-eyes"
    +    File.exist?(File.join(project_root, ".github/workflows/license-eye.yml")) ||
    +      File.exist?(File.join(project_root, ".github/workflows/license-eye.yaml")) ||
    +      github_workflows_include?(project_root, "apache/skywalking-eyes/dependency")
    +  else
    +    false
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 6283
    -
    -def preserve_gemspec_dependency_lines(template_content, destination_content, template_receiver:, destination_receiver:)
    -  template_dependencies = gemspec_dependency_line_index(template_content, receiver: template_receiver)
    -  destination_dependencies = gemspec_dependency_line_index(destination_content, receiver: destination_receiver)
    -    .transform_values do |source|
    -      normalize_gemspec_receiver(source, from: destination_receiver, to: template_receiver)
    -    end
    -  destination_dependencies = destination_dependencies.reject do |key, _source|
    -    retired_gemspec_development_dependency_key?(key)
    -  end
    -  return template_content if destination_dependencies.empty?
    +      
    # File 'lib/kettle/jem.rb', line 12726
     
    -  replacements, additions = destination_dependencies.partition do |key, source|
    -    template_dependencies.key?(key) &&
    -      gemspec_dependency_source_newer?(source, template_dependencies.fetch(key), receiver: template_receiver)
    -  end.map(&:to_h)
    +def readme_integration_project_root(project_root, template_profile, repository)
    +  return project_root unless repository_monorepo_subproject?(repository)
     
    -  merged = replace_matching_gemspec_dependency_lines(template_content, replacements, receiver: template_receiver)
    -  append_missing_gemspec_dependency_lines(merged, additions, receiver: template_receiver)
    +  Array(repository && repository[:local_root]).find { |path| !path.to_s.empty? } || project_root
     end
    -
    # File 'lib/kettle/jem.rb', line 6303
    -
    -def preserve_gemspec_freeze_blocks(content, destination_content, facts:, receiver:)
    -  blocks = freeze_marker_blocks(destination_content, freeze_token: facts.to_h.dig(:project_runtime, :freeze_token))
    -  return content if blocks.empty?
    -
    -  merged = content.to_s
    -  blocks.each do |block|
    -    next if merged.include?(block.join)
    -
    -    insertion = "\n#{block.join}\n"
    -    require_paths = gemspec_assignment_records(merged, receiver: receiver).find { |record| record.fetch(:field) == "require_paths" }
    -    merged = if require_paths
    -      insert_lines_before(merged, require_paths.fetch(:start_line), insertion)
    -    else
    -      insert_lines_before(merged, gemspec_end_line(merged), insertion)
    -    end
    -  end
    -  ensure_trailing_newline(merged.gsub(/\n{3,}/, "\n\n"))
    +    
    +
    # File 'lib/kettle/jem.rb', line 5130
    +
    +def readme_kloc_from_changelog(project_root, version)
    +  return if project_root.to_s.empty? || version.to_s.empty?
    +
    +  changelog_path = File.join(project_root, "CHANGELOG.md")
    +  return unless File.file?(changelog_path)
    +
    +  changelog_coverage_kloc(current_changelog_version_section(File.read(changelog_path), version))
     end
    -
    # File 'lib/kettle/jem.rb', line 4348
    +      
    # File 'lib/kettle/jem.rb', line 12456
     
    -def preserve_github_workflow_project_settings(recipe, content, destination_content, project_root:)
    -  return content unless recipe.fetch(:target_path).to_s == ".github/workflows/coverage.yml"
    +def readme_license_intro(licenses, author_email: nil)
    +  return mit_readme_license_intro if licenses == ["MIT"]
     
    -  thresholds = coverage_thresholds_from_project_mise(project_root)
    -  thresholds = coverage_thresholds_from_yaml_workflow(destination_content) if thresholds.empty?
    -  preserved = content
    -  thresholds.each do |key, value|
    -    preserved = replace_yaml_scalar_line(preserved, key, value)
    -  end
    -  preserved
    +  intro = "The gem is available under the following license#{"s" if licenses.size > 1}: " \
    +    "#{licenses.map { |license| license_link(license) }.join(", ")}.\n" \
    +    "See [LICENSE.md][#{paperclip_ref(:license)}] for details."
    +  intro += "\n\n#{license_contact_line(author_email, context: :readme)}" if non_mit_licenses?(licenses)
    +  guide_table = license_use_case_guide_table(licenses, author_email: author_email)
    +  intro += "\n\n### License use-case guide\n\n#{guide_table}" if guide_table
    +  intro
     end
    -
    # File 'lib/kettle/jem.rb', line 4286
    -
    -def preserve_mise_project_settings(recipe, content, destination_content, project_root:)
    -  return content unless recipe.fetch(:target_path).to_s == "mise.toml"
    +      
    # File 'lib/kettle/jem.rb', line 12485
     
    -  thresholds = coverage_thresholds_from_mise(destination_content)
    -  thresholds = coverage_thresholds_from_workflow(project_root) if thresholds.empty?
    -  thresholds.reduce(content.to_s) do |preserved, (key, value)|
    -    replace_toml_string_scalar_line(preserved, key, value)
    -  end
    +def readme_license_refs(expression, compat_category)
    +  [
    +    "[#{paperclip_ref(:copyright_notice_explainer)}]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year",
    +    "[#{paperclip_ref(:license)}]: LICENSE.md",
    +    "[#{paperclip_ref(:license_ref)}]: #{license_badge_ref(expression)}",
    +    "[#{paperclip_ref(:license_img)}]: #{license_badge_img(expression)}",
    +    "[#{paperclip_ref(:license_compat)}]: #{license_compat_ref(compat_category)}",
    +    "[#{paperclip_ref(:license_compat_img)}]: #{license_compat_img(compat_category)}"
    +  ].join("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 9986
    -
    -def preserve_readme_front_sections(template_content, destination_content)
    -  front_sections = readme_destination_front_sections(destination_content)
    -  return template_content if front_sections.empty?
    -
    -  template_sections = markdown_sections(template_content)
    -  template_h1 = template_sections.find { |section| section.fetch(:level) == 1 }
    -  insert_before = template_sections.find do |section|
    -    section.fetch(:level) == 2 && section.fetch(:start) > template_h1.to_h.fetch(:start, -1)
    -  end
    -  return template_content unless insert_before
    +      
    # File 'lib/kettle/jem.rb', line 8930
     
    -  lines = template_content.split("\n", -1)
    -  inserted = front_sections.map { |section| "#{section.fetch(:heading)}\n#{section.fetch(:body).rstrip}" }.join("\n\n")
    -  lines[(template_h1.fetch(:start) + 1)...insert_before.fetch(:start)] = ["", *inserted.split("\n"), ""]
    -  lines.join("\n")
    +def readme_logo_config_value(spec)
    +  width = spec[:width].to_s
    +  width.empty? ? spec.fetch(:type).tr("_", "-") : "#{spec.fetch(:type).tr("_", "-")}|#{width}"
     end
    -
    # File 'lib/kettle/jem.rb', line 10075
    -
    -def preserve_readme_h1(merged_content, destination_content, preserve_config)
    -  return merged_content if preserve_config.empty?
    -
    -  merged_h1 = markdown_sections(merged_content).find { |section| section.fetch(:level) == 1 }
    -  destination_h1 = markdown_sections(destination_content).find { |section| section.fetch(:level) == 1 }
    -  return merged_content unless merged_h1 && destination_h1
    +      
    # File 'lib/kettle/jem.rb', line 11950
     
    -  lines = merged_content.split("\n", -1)
    -  lines[merged_h1.fetch(:start)] = destination_h1.fetch(:heading)
    -  lines.join("\n")
    +def readme_logo_facts(config, package_name:, github_org:, repository: {})
    +  top_entries = readme_top_logo_entries(
    +    config,
    +    org: github_org.to_s,
    +    gem_name: package_name.to_s,
    +    repository: repository || {}
    +  )
    +  h2_synopsis_entries = readme_h2_synopsis_logo_entries(
    +    config,
    +    org: github_org.to_s,
    +    gem_name: package_name.to_s,
    +    repository: repository || {}
    +  )
    +  all_entries = deduplicate_readme_top_logo_entries(top_entries + h2_synopsis_entries)
    +  compact_hash(
    +    top_logos: readme_top_logo_options(config).join(","),
    +    h2_synopsis_logos: readme_h2_synopsis_logo_options(config).join(","),
    +    top_logo_row: readme_top_logo_row(top_entries),
    +    h2_synopsis_logo_row: readme_h2_synopsis_logo_row(h2_synopsis_entries),
    +    top_logo_refs: readme_top_logo_refs(all_entries)
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 10087
    -
    -def preserve_readme_managed_block(merged_content, destination_content, marker)
    -  destination_block = markdown_managed_block(destination_content, marker)
    -  return merged_content unless destination_block
    +      
    # File 'lib/kettle/jem.rb', line 12241
     
    -  replace_markdown_managed_block(merged_content, marker, destination_block)
    +def readme_logo_html(entry, align:, width: nil)
    +  attributes = [
    +    %(alt="#{html_attribute_escape("#{entry[:label]} Logo#{entry[:credit_separator]}#{entry[:credit]}")}"),
    +    %(src="#{html_attribute_escape(entry[:image_url])}")
    +  ]
    +  attributes << %(width="#{html_attribute_escape(width)}") if width
    +  attributes << %(align="#{html_attribute_escape(align)}")
    +  %(<a href="#{html_attribute_escape(entry[:href])}"><img #{attributes.join(" ")}/></a>)
     end
    -
    # File 'lib/kettle/jem.rb', line 10025
    -
    -def preserve_readme_sections(template_content, destination_content, preserve_config)
    -  template_sections = markdown_sections(template_content)
    -  destination_sections = markdown_sections(destination_content)
    -  destination_lookup = destination_sections.to_h { |section| [section.fetch(:base), section] }
    -  preserve_targets = readme_preserve_targets(template_sections, destination_lookup, preserve_config)
    -  return template_content if preserve_targets.empty?
    -
    -  template_bases = template_sections.map { |section| section.fetch(:base) }.to_set
    -  extra_sections_by_anchor = readme_extra_preserved_sections_by_anchor(
    -    destination_sections,
    -    template_bases,
    -    preserve_targets
    -  )
    -  lines = template_content.split("\n", -1)
    -  template_sections.reverse_each do |section|
    -    base = section.fetch(:base)
    -    extra_sections = extra_sections_by_anchor[base].to_a
    -    next if !preserve_targets.include?(base) && extra_sections.empty?
    -
    -    replacement = if preserve_targets.include?(base)
    -      destination_section = destination_lookup[base] ||
    -        aliased_readme_destination_section(base, destination_lookup, preserve_config)
    -      next unless destination_section
    +      
    # File 'lib/kettle/jem.rb', line 12002
     
    -      "#{section.fetch(:heading)}\n#{destination_section.fetch(:body)}"
    -    else
    -      lines[section.fetch(:start)..section.fetch(:end)].join("\n")
    -    end
    -    replacement = ([replacement] + extra_sections.map { |extra| "#{extra.fetch(:heading)}\n#{extra.fetch(:body)}" }).join("\n")
    -    lines[section.fetch(:start)..section.fetch(:end)] = replacement
    -  end
    -  lines.join("\n")
    +def readme_logo_options_from_config(config, primary_key, secondary_key, defaults)
    +  readme_logo_specs_from_config(config, primary_key, secondary_key, defaults).map { |spec| spec.fetch(:type) }
     end
    -
    # File 'lib/kettle/jem.rb', line 11075
    +      
    # File 'lib/kettle/jem.rb', line 12006
     
    -def previous_nonblank_line_number(content, line_number)
    -  lines = content.to_s.lines
    -  cursor = line_number - 2
    -  cursor -= 1 while cursor >= 0 && lines[cursor].strip.empty?
    -  (cursor >= 0) ? cursor + 1 : nil
    +def readme_logo_specs_from_config(config, primary_key, secondary_key, defaults)
    +  readme_config = readme_config_hash(config)
    +  raw_logos = readme_config[primary_key] || readme_config[secondary_key]
    +  normalized = normalized_readme_logo_specs(raw_logos)
    +  selected = normalized.select { |spec| defaults.include?(spec.fetch(:type)) }
    +  return selected unless selected.empty?
    +  return [] if raw_logos
    +
    +  legacy_mode = readme_config["top_logo_mode"].to_s.strip.downcase.tr("-", "_")
    +  legacy_options = README_TOP_LOGO_LEGACY_MODE_MAP[legacy_mode]
    +  selected_legacy = Array(legacy_options).filter_map do |option|
    +    {type: option, width: nil} if defaults.include?(option)
    +  end
    +  return selected_legacy unless selected_legacy.empty?
    +
    +  defaults.map { |option| {type: option, width: nil} }
     end
    -
    # File 'lib/kettle/jem.rb', line 5423
    +      
    # File 'lib/kettle/jem.rb', line 12255
     
    -def prism_parse_success(content)
    -  result = ::Prism.parse(content.to_s)
    -  result if result.success?
    +def readme_logo_template_tokens()
    +  {
    +    "KJ|README:H2_SYNOPSIS_LOGO_ROW" => [:h2_synopsis_logo_row].to_s,
    +    "KJ|README:TOP_LOGO_ROW" => [:top_logo_row].to_s,
    +    "KJ|README:TOP_LOGO_REFS" => [:top_logo_refs].to_s
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 5135
    +      
    # File 'lib/kettle/jem.rb', line 13930
     
    -def prism_ruby_merge_options(recipe)
    -  {
    -    method_move_policy: ruby_method_move_policy(recipe),
    -    merge_template_requires: true,
    -    template_only_placement: :after_anchor
    -  }
    +def (facts)
    +  package = facts.fetch(:package)
    +  funding_urls = facts.fetch(:funding, {}).fetch(:urls, [])
    +  rows = [
    +    ["Package", package[:name]],
    +    ["Description", package[:description]],
    +    ["Homepage", package[:homepage_url]],
    +    ["Source", package[:source_url]],
    +    ["License", (facts)],
    +    ["Funding", funding_urls.join(", ")]
    +  ].reject { |(_, value)| value.to_s.empty? }
    +
    +  [
    +    "<!-- kettle-jem:metadata:start -->",
    +    "| Field | Value |",
    +    "|---|---|",
    +    *rows.map do |field, value|
    +      "| #{(field)} | #{(value)} |"
    +    end,
    +    "<!-- kettle-jem:metadata:end -->"
    +  ].join("\n")
     end
    +
    @@ -38889,70 +55344,83 @@

    -

    +

    - .project_gemspec_declares_version_gem?(project_root) ⇒ Boolean + .readme_metadata_table_cell(value) ⇒ Object -

    -
    - +

     
     
    -5080
    -5081
    -5082
    -5083
    -5084
    -5085
    -5086
    +13957 +13958 +13959 +13960 +13961 +13962 +13963 +13964 +13965 +13966
    -
    # File 'lib/kettle/jem.rb', line 5080
    +      
    # File 'lib/kettle/jem.rb', line 13957
     
    -def process_result_adapter_failure?(merge_result)
    -  diagnostics = merge_result.respond_to?(:fetch) ? merge_result.fetch(:diagnostics, []) : []
    -  diagnostics.any? do |diagnostic|
    -    message = diagnostic[:message] || diagnostic["message"]
    -    message.to_s.include?("TreeSitterLanguagePack::ProcessResult") && message.to_s.include?("undefined method")
    +def (facts)
    +  package = facts.fetch(:package)
    +  expression = package[:license_expression].to_s
    +  spdx_ids = Array(facts.dig(:license, :spdx)).map(&:to_s).reject(&:empty?)
    +  return expression if expression.empty? || spdx_ids.empty?
    +
    +  spdx_ids.sort_by { |spdx_id| -spdx_id.length }.reduce(expression) do |formatted, spdx_id|
    +    formatted.gsub(/\b#{Regexp.escape(spdx_id)}\b/, "`#{spdx_id}`")
       end
     end
    + + + + +
    +
     
     
    -  
    +13953
    +13954
    +13955
    +
    +
    # File 'lib/kettle/jem.rb', line 13953
    +
    +def (value)
    +  value.to_s.split(/\r\n?|\n/).map(&:strip).join("<br>").gsub("|", "\\|")
    +end
    +
    -
    + +
    +

    -

    Returns:

    -
      + .readme_preserve_config(config) ⇒ Object -
    • - - - (Boolean) - - - -
    • + -
    -

    + +
    @@ -38960,9 +55428,9 @@

    -

    +

    - .project_gemspec_metadata(project_root, gemspec_path, spec: nil) ⇒ Object + .readme_preserve_config_without_partial_sections(preserve_config, partial_sections) ⇒ Object @@ -38974,71 +55442,35 @@

     
     
    -8477
    -8478
    -8479
    -8480
    -8481
    -8482
    -8483
    -8484
    -8485
    -8486
    -8487
    -8488
    -8489
    -8490
    -8491
    -8492
    -8493
    -8494
    -8495
    -8496
    -8497
    -8498
    -8499
    -8500
    -8501
    -8502
    -8503
    -8504
    -8505
    -8506
    -8507
    +4118 +4119 +4120 +4121 +4122 +4123 +4124 +4125 +4126 +4127 +4128 +4129 +4130

    @@ -39046,9 +55478,9 @@

    -

    +

    - .project_gemspec_version(project_root) ⇒ Object + .readme_preserve_targets(template_sections, destination_lookup, preserve_config) ⇒ Object @@ -39060,21 +55492,53 @@

     
     
    -3365
    -3366
    -3367
    -3368
    -3369
    -3370
    +13073 +13074 +13075 +13076 +13077 +13078 +13079 +13080 +13081 +13082 +13083 +13084 +13085 +13086 +13087 +13088 +13089 +13090 +13091 +13092 +13093 +13094

    @@ -39082,9 +55546,9 @@

    -

    +

    - .project_homepage_uri(config, env, yard_host:) ⇒ Object + .readme_project_emoji(project_root) ⇒ Object @@ -39096,17 +55560,25 @@

     
     
    -8626
    -8627
    -8628
    -8629
    +9423 +9424 +9425 +9426 +9427 +9428 +9429 +9430

    @@ -39114,39 +55586,52 @@

    -

    +

    - .project_runtime_config_value(config, key) ⇒ Object + .readme_section_contains_badge_cloud?(section) ⇒ Boolean -

     
     
    -3372
    -3373
    -3374
    -3375
    -3376
    -3377
    -3378
    -3379
    -3380
    -3381
    -3382
    -3383
    +13104 +13105 +13106 +13107 +13108 +13109 +13110 +13111 +13112 +13113 +13114 +13115 +13116 +13117 +13118
    -
    # File 'lib/kettle/jem.rb', line 3372
    +      
    # File 'lib/kettle/jem.rb', line 13104
     
    -def project_gemspec_declares_version_gem?(project_root)
    -  path = Dir.glob(File.join(project_root, "*.gemspec")).min
    -  return false unless path
    +def readme_preserve_config(config)
    +  readme = config["readme"]
    +  return {} unless readme.is_a?(Hash)
     
    -   = (path)
    -  dependencies = Array([:runtime_dependencies] || ["runtime_dependencies"])
    -  if dependencies.empty?
    -    spec = load_project_gemspec(path)
    -    dependencies = Array(spec&.runtime_dependencies)
    +  result = {}
    +  result[:sections] = Array(readme["preserve_sections"]) if readme.key?("preserve_sections")
    +  result[:patterns] = Array(readme["preserve_patterns"]) if readme.key?("preserve_patterns")
    +  if readme["section_aliases"].is_a?(Hash)
    +    result[:aliases] = README_SECTION_ALIASES.merge(
    +      readme["section_aliases"].transform_keys { |key| normalize_readme_heading(key) }
    +                               .transform_values { |value| normalize_readme_heading(value) }
    +    )
       end
    -  dependencies.any? { |dependency| dependency.name == "version_gem" }
    +  result
     end
    -
    # File 'lib/kettle/jem.rb', line 8477
    -
    -def (project_root, gemspec_path, spec: nil)
    -   = quiet_gemspec_reader_load(project_root)
    -  spec ||= load_project_gemspec(gemspec_path)
    -   = {} unless .is_a?(Hash)
    -   = .dup
    -
    -  if spec
    -    [:gemspec_path] ||= gemspec_path
    -    [:gem_name] = spec.name.to_s if (, :gem_name).nil?
    -    [:version] = spec.version.to_s if (, :version).nil?
    -    [:min_ruby] = min_ruby_version(spec.required_ruby_version) if [:min_ruby].nil?
    -    [:homepage] = spec.homepage.to_s if (, :homepage).nil?
    -    [:source_code_uri] = spec..fetch("source_code_uri", nil) if (, :source_code_uri).nil?
    -    [:funding_uri] = spec..fetch("funding_uri", nil) if (, :funding_uri).nil?
    -    [:authors] = Array(spec.authors).compact.uniq if Array([:authors]).empty?
    -    [:email] = Array(spec.email).compact.uniq if Array([:email]).empty?
    -    [:summary] = spec.summary.to_s if (, :summary).nil?
    -    [:description] = spec.description.to_s if (, :description).nil?
    -    [:licenses] = Array(spec.licenses) if Array([:licenses]).empty?
    -    [:required_ruby_version] = spec.required_ruby_version if [:required_ruby_version].nil?
    -    [:require_paths] = Array(spec.require_paths) if Array([:require_paths]).empty?
    -    [:bindir] = spec.bindir.to_s if (, :bindir).nil?
    -    [:executables] = Array(spec.executables) if Array([:executables]).empty?
    -  end
    +      
    # File 'lib/kettle/jem.rb', line 4118
     
    -  return {} unless present_template_token_value?([:gem_name])
    +def readme_preserve_config_without_partial_sections(preserve_config, partial_sections)
    +  normalized_partials = partial_sections.map { |section| normalize_readme_section_key(section) }
    +  return preserve_config if normalized_partials.empty?
     
    -  
    -rescue LoadError, StandardError
    -  (gemspec_path)
    +  config = (preserve_config || {}).dup
    +  sections = if config.key?(:sections)
    +    Array(config[:sections]).map { |section| normalize_readme_section_key(section) }
    +  else
    +    README_DEFAULT_PRESERVE_SECTIONS.dup
    +  end
    +  config[:sections] = sections.reject { |section| normalized_partials.include?(section) }
    +  config
     end
    -
    # File 'lib/kettle/jem.rb', line 3365
    -
    -def project_gemspec_version(project_root)
    -  path = Dir.glob(File.join(project_root, "*.gemspec")).min
    -  return "" unless path
    +      
    # File 'lib/kettle/jem.rb', line 13073
     
    -  load_project_gemspec(path)&.version.to_s
    +def readme_preserve_targets(template_sections, destination_lookup, preserve_config)
    +  sections = if preserve_config.key?(:sections)
    +    Array(preserve_config[:sections]).map { |section| normalize_readme_heading(section) }
    +  else
    +    README_DEFAULT_PRESERVE_SECTIONS.dup
    +  end
    +  patterns = if preserve_config.key?(:patterns)
    +    Array(preserve_config[:patterns]).map { |pattern| pattern.to_s.strip.downcase }
    +  else
    +    README_DEFAULT_PRESERVE_PATTERNS.dup
    +  end
    +  aliases = preserve_config[:aliases] || README_SECTION_ALIASES
    +  targets = sections.dup
    +  template_sections.each do |section|
    +    base = section.fetch(:base)
    +    targets << base if patterns.any? { |pattern| File.fnmatch?(pattern, base, File::FNM_PATHNAME) }
    +  end
    +  aliases.each do |from, to|
    +    targets << to if destination_lookup.key?(from) && targets.include?(to)
    +  end
    +  targets.uniq
     end
    -
    # File 'lib/kettle/jem.rb', line 8626
    +      
    # File 'lib/kettle/jem.rb', line 9423
     
    -def project_homepage_uri(config, env, yard_host:)
    -  derived = "https://#{yard_host}" if present_template_token_value?(yard_host)
    -  preferred_template_token_value(derived, project_runtime_config_value(config, "homepage_uri"), env, "KJ_HOMEPAGE_URI").to_s
    +def readme_project_emoji(project_root)
    +  readme_path = File.join(project_root, "README.md")
    +  return unless File.exist?(readme_path)
    +
    +  h1 = markdown_heading_owners(File.read(readme_path), source_label: "README.md").find { |owner| owner.level == 1 }
    +  candidate = first_grapheme(h1&.heading_text)
    +  decorative_grapheme?(candidate) ? candidate : nil
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -39154,69 +55639,66 @@

    -

    +

    - .project_runtime_facts(config, env, package_name:, source_url:, author_domain:, min_ruby:, test_min_ruby:, version:) ⇒ Object + .readme_section_has_preserved_ancestor?(sections, index, preserve_targets) ⇒ Boolean -

     
     
    -8631
    -8632
    -8633
    -8634
    -8635
    -8636
    -8637
    -8638
    +12956 +12957 +12958
    -
    # File 'lib/kettle/jem.rb', line 8631
    -
    -def project_runtime_config_value(config, key)
    -  token_config = token_config_values(config)
    -  runtime_config = token_config["project_runtime"].is_a?(Hash) ? token_config["project_runtime"] : {}
    -  top_level_value = config[key]
    -  return top_level_value if present_template_token_value?(top_level_value)
    +      
    # File 'lib/kettle/jem.rb', line 12956
     
    -  runtime_config[key]
    +def readme_section_contains_badge_cloud?(section)
    +  section.fetch(:body).to_s.lines.any? { |line| line.include?("[![") }
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -39224,9 +55706,9 @@

    -

    +

    - .project_runtime_template_tokens(project_runtime) ⇒ Object + .readme_section_partials(project_root, config, readme) ⇒ Object @@ -39238,39 +55720,57 @@

     
     
    -8598
    -8599
    -8600
    -8601
    -8602
    -8603
    -8604
    -8605
    -8606
    -8607
    -8608
    -8609
    -8610
    -8611
    -8612
    +12746 +12747 +12748 +12749 +12750 +12751 +12752 +12753 +12754 +12755 +12756 +12757 +12758 +12759 +12760 +12761 +12762 +12763 +12764 +12765 +12766 +12767 +12768 +12769

    @@ -39278,9 +55778,9 @@

    -

    +

    - .project_yard_host(config, env, package_name:, author_domain:) ⇒ Object + .readme_section_partials_for_render(readme_style, facts) ⇒ Object @@ -39292,17 +55792,33 @@

     
     
    -8614
    -8615
    -8616
    -8617
    +4105 +4106 +4107 +4108 +4109 +4110 +4111 +4112 +4113 +4114 +4115 +4116

    @@ -39310,9 +55826,9 @@

    -

    +

    - .prune_appraisals_below_min_ruby(content, min_ruby) ⇒ Object + .readme_style_facts(project_root, config, license, template_profile: nil, repository: nil) ⇒ Object @@ -39324,41 +55840,71 @@

     
     
    -5889
    -5890
    -5891
    -5892
    -5893
    -5894
    -5895
    -5896
    -5897
    -5898
    -5899
    -5900
    -5901
    -5902
    -5903
    -5904
    +12672 +12673 +12674 +12675 +12676 +12677 +12678 +12679 +12680 +12681 +12682 +12683 +12684 +12685 +12686 +12687 +12688 +12689 +12690 +12691 +12692 +12693 +12694 +12695 +12696 +12697 +12698 +12699 +12700 +12701 +12702

    @@ -39366,9 +55912,9 @@

    -

    +

    - .prune_appraisals_recording_entries(content, facts) ⇒ Object + .readme_template_tokens(facts) ⇒ Object @@ -39380,69 +55926,67 @@

     
     
    -5661
    -5662
    -5663
    -5664
    -5665
    -5666
    -5667
    -5668
    -5669
    -5670
    -5671
    -5672
    -5673
    -5674
    -5675
    -5676
    -5677
    -5678
    -5679
    -5680
    -5681
    -5682
    -5683
    -5684
    -5685
    -5686
    -5687
    -5688
    -5689
    -5690
    +4132 +4133 +4134 +4135 +4136 +4137 +4138 +4139 +4140 +4141 +4142 +4143 +4144 +4145 +4146 +4147 +4148 +4149 +4150 +4151 +4152 +4153 +4154 +4155 +4156 +4157 +4158 +4159 +4160

    @@ -39450,9 +55994,9 @@

    -

    +

    - .prune_github_workflow_matrix_by_min_ruby(content, facts) ⇒ Object + .readme_top_logo_credit_separator(type) ⇒ Object @@ -39464,47 +56008,15 @@

    -4908 -4909 -4910 -4911 -4912 -4913 -4914 -4915 -4916 -4917 -4918 -4919 -4920 -4921 -4922 -4923 -4924 -4925 -4926 +12189 +12190 +12191

    @@ -39512,9 +56024,9 @@

    -

    +

    - .prune_legacy_kettle_config_keys(content) ⇒ Object + .readme_top_logo_default_alt(type, slug) ⇒ Object @@ -39526,18 +56038,38 @@

     
     
    -6722
    -6723
    -6724
    -6725
    -6726
    +12149 +12150 +12151 +12152 +12153 +12154 +12155 +12156 +12157 +12158 +12159 +12160 +12161 +12162 +12163

    @@ -39546,9 +56078,9 @@

    -

    - .prune_missing_workflow_link_definitions(content, workflow_paths) ⇒ Object + .readme_top_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object @@ -39560,37 +56092,29 @@

    @@ -39598,9 +56122,9 @@ @@ -39650,9 +56158,9 @@

    -

    - .prune_unused_readme_logo_link_definitions(content) ⇒ Object + .readme_top_logo_entry_from_config(logo, org:, gem_name:, repository: {}) ⇒ Object @@ -39664,29 +56172,67 @@

    @@ -39694,64 +56240,35 @@

    - - .prune_workflow_matrix_item?(mapping, minimum) ⇒ Boolean +

    - + .readme_top_logo_entry_from_option(option, org:, gem_name:, repository: {}) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -
     
     
    -8453
    -8454
    -8455
    -8456
    -8457
    -8458
    -8459
    -8460
    -8461
    -8462
    -8463
    -8464
    -8465
    -8466
    -8467
    -8468
    -8469
    -8470
    -8471
    -8472
    -8473
    -8474
    -8475
    +13011 +13012 +13013 +13014 +13015 +13016 +13017 +13018 +13019 +13020
    -
    # File 'lib/kettle/jem.rb', line 8453
    +      
    # File 'lib/kettle/jem.rb', line 13011
     
    -def project_runtime_facts(config, env, package_name:, source_url:, author_domain:, min_ruby:, test_min_ruby:, version:)
    -  run_timestamp = Time.now
    -  configured_project_emoji = preferred_template_token_value(nil, config["project_emoji"], env, "KJ_PROJECT_EMOJI")
    -  yard_host = project_yard_host(config, env, package_name: package_name, author_domain: author_domain)
    -  compact_hash(
    -    freeze_token: config.dig("defaults", "freeze_token").to_s.empty? ? "kettle-jem" : config.dig("defaults", "freeze_token").to_s,
    -    kettle_jem_version: VERSION,
    -    template_run_date: run_timestamp.strftime("%Y-%m-%d"),
    -    template_run_year: run_timestamp.year.to_s,
    -    kettle_dev_gem: "kettle-dev",
    -    kettle_rb_local_gems: kettle_rb_local_gems(config),
    -    package_name: package_name.to_s,
    -    yard_host: yard_host,
    -    homepage_uri: project_homepage_uri(config, env, yard_host: yard_host),
    -    project_emoji: preferred_template_token_value("💎", config["project_emoji"], env, "KJ_PROJECT_EMOJI").to_s,
    -    project_emoji_configured: !configured_project_emoji.to_s.empty?,
    -    min_divergence_threshold: preferred_template_token_value(nil, config["min_divergence_threshold"], env, "KJ_MIN_DIVERGENCE_THRESHOLD").to_s,
    -    min_dev_ruby: test_min_ruby.to_s,
    -    test_min_ruby: test_min_ruby.to_s,
    -    version: version.to_s,
    -    github_org: github_org_from_url(source_url).to_s
    -  )
    +def readme_section_has_preserved_ancestor?(sections, index, preserve_targets)
    +  section = sections.fetch(index)
    +  section_level = section.fetch(:level).to_i
    +  sections[0...index].reverse_each do |candidate|
    +    next unless candidate.fetch(:level).to_i < section_level
    +
    +    return preserve_targets.include?(candidate.fetch(:base))
    +  end
    +  false
     end
    -
    # File 'lib/kettle/jem.rb', line 8598
    +      
    # File 'lib/kettle/jem.rb', line 12746
     
    -def project_runtime_template_tokens(project_runtime)
    -  {
    -    "KJ|FREEZE_TOKEN" => project_runtime[:freeze_token].to_s,
    -    "KJ|KETTLE_JEM_VERSION" => project_runtime[:kettle_jem_version].to_s,
    -    "KJ|TEMPLATE_RUN_DATE" => project_runtime[:template_run_date].to_s,
    -    "KJ|TEMPLATE_RUN_YEAR" => project_runtime[:template_run_year].to_s,
    -    "KJ|KETTLE_DEV_GEM" => project_runtime[:kettle_dev_gem].to_s,
    -    "KJ|KETTLE_RB_LOCAL_GEMS" => project_runtime[:kettle_rb_local_gems].to_s,
    -    "KJ|PACKAGE_NAME" => project_runtime[:package_name].to_s,
    -    "KJ|YARD_HOST" => project_runtime[:yard_host].to_s,
    -    "KJ|HOMEPAGE_URI" => project_runtime[:homepage_uri].to_s,
    -    "KJ|PROJECT_EMOJI" => project_runtime[:project_emoji].to_s,
    -    "KJ|MIN_DIVERGENCE_THRESHOLD" => project_runtime[:min_divergence_threshold].to_s
    -  }
    +def readme_section_partials(project_root, config, readme)
    +  configured = readme["section_partials"]
    +  return {} unless configured.is_a?(Hash)
    +
    +  root = template_root(project_root, config["templates"].is_a?(Hash) ? config["templates"] : {})
    +  configured.each_with_object({}) do |(section, source), result|
    +    normalized = normalize_readme_section_key(section)
    +    next if normalized.empty?
    +
    +    source_path = source.to_s
    +    next if source_path.empty?
    +
    +    selected = preferred_template_source(root.fetch(:path), source_path)
    +    next unless selected
    +
    +    result[normalized] = {
    +      configured_source: source_path,
    +      selected_source: template_source_display_path(root, selected),
    +      source_relative_path: selected,
    +      source_root: root.fetch(:kind),
    +      content: File.read(File.join(root.fetch(:path), selected))
    +    }
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 8614
    +      
    # File 'lib/kettle/jem.rb', line 4105
     
    -def project_yard_host(config, env, package_name:, author_domain:)
    -  derived = "#{package_name.to_s.tr("_", "-")}.#{author_domain.to_s.empty? ? "example.com" : author_domain}"
    -  preferred_template_token_value(derived, project_runtime_config_value(config, "yard_host"), env, "KJ_YARD_HOST").to_s
    +def readme_section_partials_for_render(readme_style, facts)
    +  partials = readme_style[:section_partials]
    +  return {} unless partials.is_a?(Hash)
    +
    +  tokens = readme_template_tokens(facts)
    +  partials.each_with_object({}) do |(section, partial), result|
    +    content = partial.is_a?(Hash) ? partial[:content].to_s : partial.to_s
    +    next if content.strip.empty?
    +
    +    result[normalize_readme_section_key(section)] = resolve_template_tokens(content, tokens)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 5889
    -
    -def prune_appraisals_below_min_ruby(content, min_ruby)
    -  return content if min_ruby.to_s.empty?
    -
    -  minimum = Gem::Version.new(min_ruby.to_s)
    -  remove_indexes = Set.new
    -  appraisal_call_records(content).each do |record|
    -    version = ruby_appraisal_name_version(record.fetch(:name))
    -    next unless version && version < minimum
    +      
    # File 'lib/kettle/jem.rb', line 12672
     
    -    (record.fetch(:start_line)..record.fetch(:end_line)).each { |line_number| remove_indexes << (line_number - 1) }
    +def readme_style_facts(project_root, config, license, template_profile: nil, repository: nil)
    +  readme = config["readme"].is_a?(Hash) ? config["readme"] : {}
    +  conditional = readme["conditional_sections"].is_a?(Hash) ? readme["conditional_sections"] : {}
    +  disabled_integrations = readme_disabled_integrations(readme, integration_disabled: disabled_integrations(config, license: license))
    +  integration_root = readme_integration_project_root(project_root, template_profile, repository)
    +  missing_integrations = README_DISCOVERED_INTEGRATIONS.reject do |integration|
    +    disabled_integrations.include?(integration) || readme_integration_configured?(integration_root, integration)
       end
    -  kept = content.to_s.lines.each_with_index.reject { |_line, index| remove_indexes.include?(index) }.map(&:first)
    -  ensure_trailing_newline(kept.join.gsub(/\n{3,}/, "\n\n"))
    -rescue ArgumentError
    -  content
    +  workflow_paths = readme_workflow_paths(integration_root)
    +  omitted_sections = []
    +  security_enabled = repository_monorepo_subproject?(repository) ||
    +    File.exist?(File.join(project_root, "SECURITY.md"))
    +  floss_funding_enabled = readme_floss_funding_enabled?(license, conditional["floss_funding"])
    +  omitted_sections << "security" unless security_enabled
    +  omitted_sections << "floss_funding" unless floss_funding_enabled
    +  section_partials = readme_section_partials(project_root, config, readme)
    +  package_family = readme["package_family"].to_s.strip.downcase
    +  fossa_project = readme_fossa_project(readme, repository)
    +  compact_hash(
    +    profile: "slice-740-kettle-readme-style-profile",
    +    security_enabled: security_enabled,
    +    floss_funding_enabled: floss_funding_enabled,
    +    package_family: package_family,
    +    fossa_project: fossa_project,
    +    omitted_sections: omitted_sections,
    +    disabled_integrations: disabled_integrations,
    +    missing_integrations: missing_integrations,
    +    workflow_paths: workflow_paths,
    +    section_partials: section_partials
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 5661
    -
    -def prune_appraisals_recording_entries(content, facts)
    -  remove_indexes = Set.new
    -  lines = content.to_s.lines
    -  unless facts.to_h.dig(:ci, :recording)
    -    ruby_call_records(content, :eval_gemfile).each do |call|
    -      path = ruby_string_argument(call)
    -      next unless path.to_s.include?("modular/recording/")
    -
    -      (call.location.start_line..call.location.end_line).each { |line_number| remove_indexes << (line_number - 1) }
    -    end
    -  end
    -  head_appraisal = appraisal_call_records(content).find { |record| record.fetch(:name) == "head" }
    -  if head_appraisal
    -    gemfile_gem_call_records(content).each do |record|
    -      next unless record.fetch(:name) == "cgi"
    -      next unless record.fetch(:start_line) >= head_appraisal.fetch(:start_line)
    -      next unless record.fetch(:end_line) <= head_appraisal.fetch(:end_line)
    -
    -      start_index = record.fetch(:start_line) - 1
    -      while start_index.positive? && gemfile_comment_line?(lines[start_index - 1])
    -        start_index -= 1
    -      end
    -      (start_index..(record.fetch(:end_line) - 1)).each { |index| remove_indexes << index }
    -    end
    -  end
    -  return content if remove_indexes.empty?
    +      
    # File 'lib/kettle/jem.rb', line 4132
     
    -  kept = lines.each_with_index.reject { |_line, index| remove_indexes.include?(index) }.map(&:first)
    -  ensure_trailing_newline(kept.join.gsub(/\n{3,}/, "\n\n"))
    +def readme_template_tokens(facts)
    +  {
    +    "KJ|CB:USER" => "",
    +    "KJ|FUNDING:BUYMEACOFFEE" => "",
    +    "KJ|FUNDING:KOFI" => "",
    +    "KJ|FUNDING:LIBERAPAY" => "",
    +    "KJ|FUNDING:PAYPAL" => "",
    +    "KJ|GH:USER" => "",
    +    "KJ|GH_ORG" => github_org_from_url(facts.dig(:package, :source_url)).to_s,
    +    "KJ|GL:USER" => "",
    +    "KJ|PROJECT_EMOJI" => "💎",
    +    "KJ|README:COPYRIGHT_NOTICE" => "",
    +    "KJ|README:LICENSE_BADGE" => "",
    +    "KJ|README:LICENSE_COMPAT_BADGE" => "",
    +    "KJ|README:DEV_TEST_STACK_TABLE" => "",
    +    "KJ|README:LICENSE_INTRO" => "",
    +    "KJ|README:LICENSE_REFS" => "",
    +    "KJ|README:H2_SYNOPSIS_LOGO_ROW" => "",
    +    "KJ|README:TOP_LOGO_REFS" => "",
    +    "KJ|README:TOP_LOGO_ROW" => "",
    +    "KJ|SH:USER" => "",
    +    "KJ|SOCIAL:BLUESKY" => "",
    +    "KJ|SOCIAL:DEVTO" => "",
    +    "KJ|SOCIAL:LINKTREE" => "",
    +    "KJ|SOCIAL:MASTODON" => "",
    +    "KJ|HOMEPAGE_URI" => "https://rubydoc.info",
    +    "KJ|YARD_HOST" => "rubydoc.info"
    +  }.merge(template_tokens(facts, facts.fetch(:funding, {})))
     end
    -
    # File 'lib/kettle/jem.rb', line 4908
    -
    -def prune_github_workflow_matrix_by_min_ruby(content, facts)
    -  min_ruby = minimum_ruby_token(facts.to_h.dig(:ci, :test_min_ruby) || facts.to_h.dig(:rubygems, :min_ruby))
    -  return content if min_ruby.to_s.empty?
    -
    -  minimum = Gem::Version.new(min_ruby)
    -  lines = content.to_s.lines
    -  remove_indexes = Set.new
    -  yaml_mapping_nodes(content).each do |mapping|
    -    next unless prune_workflow_matrix_item?(mapping, minimum)
    -
    -    (mapping.start_line...mapping.end_line).each { |line_index| remove_indexes << line_index }
    -  end
    -
    -  return content if remove_indexes.empty?
    +      
    # File 'lib/kettle/jem.rb', line 12189
     
    -  ensure_trailing_newline(lines.each_with_index.reject { |_line, line_index| remove_indexes.include?(line_index) }.map(&:first).join.gsub(/\n{3,}/, "\n\n"))
    -rescue
    -  content
    +def readme_top_logo_credit_separator(type)
    +  (type == "ruby") ? ", " : " by "
     end
    -
    # File 'lib/kettle/jem.rb', line 6722
    +      
    # File 'lib/kettle/jem.rb', line 12149
     
    -def prune_legacy_kettle_config_keys(content)
    -  KETTLE_CONFIG_LEGACY_KEY_PATHS.reduce(content.to_s) do |updated, legacy_key|
    -    remove_yaml_scalar_path(updated, legacy_key.fetch(:path))
    +def readme_top_logo_default_alt(type, slug)
    +  label = slug.split("/").last.to_s
    +  case type
    +  when "related_org"
    +    "Galtzo FLOSS"
    +  when "ruby"
    +    "ruby-lang"
    +  when "org"
    +    label
    +  when "project"
    +    label
    +  else
    +    "#{label} affiliated project"
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 4716
    +      
    # File 'lib/kettle/jem.rb', line 12058
     
    -def prune_missing_workflow_link_definitions(content, workflow_paths)
    -  existing = Array(workflow_paths).map { |path| path.to_s.delete_prefix("./") }.to_set
    -  Ast::Crispr::Markdown::Markly.document_context(content: content.to_s, source_label: "README.md")
    -    .structural_owners(owner_scope: :link_definitions)
    -    .reduce(content.to_s) do |processed, owner|
    -      workflow_path = readme_workflow_path_from_url(owner.url)
    -      next processed if workflow_path.empty? || existing.include?(workflow_path)
    +def readme_top_logo_entries(config, org:, gem_name:, repository: {})
    +  configured = configured_readme_top_logo_entries(config, org: org, gem_name: gem_name, repository: repository)
    +  return readme_top_logo_entries_with_asset_size(configured) if configured
     
    -      delete_markdown_with_ast_crispr(
    -        processed,
    -        Ast::Crispr::Markdown::Markly::Selectors.link_definition(label: owner.label, limit: {at_least: 0})
    -      )
    -    end
    +  entries = readme_logo_specs_from_config(config, "top_logos", "top_logo_options", README_TOP_LOGO_DEFAULTS).filter_map do |spec|
    +    readme_top_logo_entry_from_option(spec.fetch(:type), org: org, gem_name: gem_name, repository: repository)&.merge(width: spec[:width])
    +  end
    +  entries = deduplicate_readme_top_logo_entries(entries)
    +  readme_top_logo_entries_with_asset_size(entries)
     end
    -
    # File 'lib/kettle/jem.rb', line 4701
    +      
    # File 'lib/kettle/jem.rb', line 12077
     
    -def prune_readme_integration_badges(content, readme_style)
    -  integrations = Array(readme_style[:missing_integrations]) + Array(readme_style[:disabled_integrations])
    -  integrations.uniq.reduce(content.to_s) do |result, integration|
    -    pruned_badges = README_INTEGRATION_BADGE_PATTERNS.fetch(integration.to_s, []).reduce(result) do |memo, pattern|
    -      memo.gsub(pattern, "")
    -    end
    -    README_INTEGRATION_LINK_LABELS.fetch(integration.to_s, []).reduce(pruned_badges) do |memo, label|
    -      delete_markdown_with_ast_crispr(
    -        memo,
    -        Ast::Crispr::Markdown::Markly::Selectors.link_definition(label: label, limit: {at_least: 0})
    -      )
    -    end
    -  end.gsub(/[ \t]{2,}/, " ")
    +def readme_top_logo_entries_with_asset_size(entries)
    +  entries.map do |entry|
    +    image_url = entry.fetch(:image_url).to_s.sub(%r{/avatar-\d+px\.svg\z}, "/avatar-128px.svg")
    +    entry.merge(image_url: image_url)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 4402
    +      
    # File 'lib/kettle/jem.rb', line 12104
     
    -def prune_unused_readme_logo_link_definitions(content)
    -  referenced = ReadmePostProcessor.markdown_inline_reference_owners(content).flat_map(&:labels).map(&:to_s).to_set
    -  labels = ReadmePostProcessor.markdown_link_definition_owners(content).filter_map do |owner|
    -    label = owner.label.to_s
    -    label if label.start_with?("🖼️") && !referenced.include?(label)
    -  end
    -  return content if labels.empty?
    +def readme_top_logo_entry_from_config(, org:, gem_name:, repository: {})
    +  return unless .is_a?(Hash)
     
    -  ReadmePostProcessor.delete_markdown_link_definitions(content, labels)
    +  type = ["type"].to_s.strip.downcase.tr("-", "_")
    +  return unless README_TOP_LOGO_TYPES.include?(type)
    +  type = "ruby" if type == "language"
    +
    +  slug = ["slug"].to_s.strip
    +  slug = default_readme_top_logo_slug(type, org: org, gem_name: gem_name, repository: repository) if slug.empty?
    +  return if slug.empty?
    +
    +  alt = ["alt"].to_s.strip
    +  alt = readme_top_logo_default_alt(type, slug) if alt.empty?
    +  href = ["href"].to_s.strip
    +  href = default_readme_top_logo_href(type, slug: slug, org: org, gem_name: gem_name, repository: repository) if href.empty?
    +  credit = ["credit"].to_s.strip
    +  credit = default_readme_top_logo_credit(type) if credit.empty?
    +  ref_slug = slug.tr("/", "-")
    +  {
    +    type: type,
    +    label: alt.sub(/\s+logo\z/i, ""),
    +    credit: credit,
    +    credit_separator: readme_top_logo_credit_separator(type),
    +    image_ref: "#{ref_slug}-i",
    +    link_ref: ref_slug,
    +    image_url: "#{LOGOS_GALTZO_BASE_URL}/#{slug}/avatar-192px.svg",
    +    href: href
    +  }
     end
    +
    @@ -39759,66 +56276,29 @@

    -

    - - .quality_config_path?(path) ⇒ Boolean +

    - + .readme_top_logo_options(config) ⇒ Object -

    -
    - - -
    -
    -
    -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • - -
    - -

     
     
    -5036
    -5037
    -5038
    -5039
    -5040
    -5041
    -5042
    -5043
    -5044
    +12207 +12208 +12209 +12210 +12211 +12212
    -
    # File 'lib/kettle/jem.rb', line 5036
    +      
    # File 'lib/kettle/jem.rb', line 12207
     
    -def prune_workflow_matrix_item?(mapping, minimum)
    -  ruby = yaml_mapping_scalar_value(mapping, "ruby")
    -  return true if ruby && Gem::Version.new(ruby) < minimum
    +def readme_top_logo_entry_from_option(option, org:, gem_name:, repository: {})
    +  return if option == "org" && org.to_s.empty?
    +  return if option == "project" && (org.to_s.empty? || gem_name.to_s.empty?)
     
    -  appraisal_ruby_version = appraisal_ruby_version(yaml_mapping_scalar_value(mapping, "appraisal"))
    -  appraisal_ruby_version && Gem::Version.new(appraisal_ruby_version) < minimum
    -rescue ArgumentError
    -  false
    +  readme_top_logo_entry_from_config({"type" => option}, org: org, gem_name: gem_name, repository: repository)
     end
    +
    @@ -39826,9 +56306,9 @@

    -

    +

    - .quiet_gemspec_reader_load(project_root) ⇒ Object + .readme_top_logo_refs(entries) ⇒ Object @@ -39840,29 +56320,15 @@

     
     
    -8573
    -8574
    -8575
    -8576
    -8577
    -8578
    -8579
    -8580
    -8581
    -8582
    +12237 +12238 +12239

    @@ -39870,68 +56336,35 @@

    -

    - - .rakefile_default_task_call?(call) ⇒ Boolean +

    - + .readme_top_logo_row(entries) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -7797
    -7798
    -7799
    -7800
    -7801
    -7802
    -7803
    -7804
    -7805
    -7806
    +11973 +11974 +11975
    -
    # File 'lib/kettle/jem.rb', line 7797
    +      
    # File 'lib/kettle/jem.rb', line 11973
     
    -def quality_config_path?(path)
    -  %w[
    -    .rubocop.yml
    -    .reek.yml
    -    .standard.yml
    -    .simplecov
    -    .yardopts
    -    Rakefile
    -  ].include?(path)
    +def readme_top_logo_options(config)
    +  readme_logo_options_from_config(config, "top_logos", "top_logo_options", README_TOP_LOGO_DEFAULTS)
     end
    -
    # File 'lib/kettle/jem.rb', line 8573
    +      
    # File 'lib/kettle/jem.rb', line 12237
     
    -def quiet_gemspec_reader_load(project_root)
    -  original_stderr = $stderr
    -  original_stdout = $stdout
    -  $stderr = StringIO.new
    -  $stdout = StringIO.new
    -  GemSpecReader.load(project_root)
    -ensure
    -  $stderr = original_stderr
    -  $stdout = original_stdout
    +def readme_top_logo_refs(entries)
    +  ""
     end
    +
    @@ -39939,9 +56372,9 @@

    -

    +

    - .rakefile_default_task_records(content) ⇒ Object + .readme_url_template_tokens(repository, package_name, github_org) ⇒ Object @@ -39953,29 +56386,171 @@

     
     
    -11036
    -11037
    -11038
    -11039
    -11040
    -11041
    -11042
    -11043
    -11044
    -11045
    +10415 +10416 +10417 +10418 +10419 +10420 +10421 +10422 +10423 +10424 +10425 +10426 +10427 +10428 +10429 +10430 +10431 +10432 +10433 +10434 +10435 +10436 +10437 +10438 +10439 +10440 +10441 +10442 +10443 +10444 +10445 +10446 +10447 +10448 +10449 +10450 +10451 +10452 +10453 +10454 +10455 +10456 +10457 +10458 +10459 +10460 +10461 +10462 +10463 +10464 +10465 +10466 +10467 +10468 +10469 +10470 +10471 +10472 +10473 +10474 +10475 +10476 +10477 +10478 +10479 +10480 +10481 +10482 +10483 +10484 +10485 +10486 +10487 +10488 +10489 +10490 +10491 +10492 +10493 +10494 +10495

    @@ -39983,9 +56558,9 @@

    -

    +

    - .rakefile_require_records(content) ⇒ Object + .readme_workflow_path_from_url(url) ⇒ Object @@ -39997,33 +56572,31 @@

     
     
    -10997
    -10998
    -10999
    -11000
    -11001
    -11002
    -11003
    -11004
    -11005
    -11006
    -11007
    -11008
    +5448 +5449 +5450 +5451 +5452 +5453 +5454 +5455 +5456 +5457 +5458

    @@ -40031,9 +56604,9 @@

    -

    +

    - .rakefile_scaffold_cleanup(content, facts) ⇒ Object + .readme_workflow_paths(project_root) ⇒ Object @@ -40045,19 +56618,19 @@

     
     
    -3944
    -3945
    -3946
    -3947
    -3948
    +12740 +12741 +12742 +12743 +12744

    @@ -40065,52 +56638,39 @@

    -

    - - .rakefile_scaffold_cleanup_recipe?(recipe) ⇒ Boolean +

    - + .recipe_decision_category(recipe) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -11047
    -11048
    -11049
    -11050
    -11051
    -11052
    -11053
    -11054
    -11055
    -11056
    -11057
    +12214 +12215 +12216 +12217 +12218 +12219
    -
    # File 'lib/kettle/jem.rb', line 11047
    +      
    # File 'lib/kettle/jem.rb', line 12214
     
    -def rakefile_default_task_call?(call)
    -  argument = call.arguments&.arguments&.first
    -  case argument
    -  when ::Prism::SymbolNode
    -    argument.unescaped.to_s == "default"
    -  when ::Prism::KeywordHashNode
    -    argument.elements.any? { |element| element.key.is_a?(::Prism::SymbolNode) && element.key.unescaped.to_s == "default" }
    -  else
    -    false
    -  end
    +def readme_top_logo_row(entries)
    +  default_width = readme_default_logo_width(entries, one: "14%", two: "12%")
    +  entries.map do |entry|
    +    readme_logo_html(entry, align: "right", width: entry[:width] || default_width)
    +  end.join(" ")
     end
    -
    # File 'lib/kettle/jem.rb', line 11036
    +      
    # File 'lib/kettle/jem.rb', line 10415
     
    -def rakefile_default_task_records(content)
    -  top_level_ruby_call_records(content, :task).filter_map do |call|
    -    next unless rakefile_default_task_call?(call)
    +def readme_url_template_tokens(repository, package_name, github_org)
    +  repo_url = repository[:url].to_s
    +  repo_name = repository[:name].to_s
    +  repo_slug = repository[:slug].to_s
    +  package_path = repository[:package_path].to_s
    +  package_source_url = repository[:package_source_url].to_s
    +  repo_url = "https://github.com/#{github_org}/#{package_name}" if repo_url.empty?
    +  repo_name = package_name if repo_name.empty?
    +  repo_slug = "#{github_org}/#{repo_name}" if repo_slug.empty?
    +  package_source_url = repo_url if package_source_url.empty?
     
    -    {
    -      start_line: call.location.start_line,
    -      end_line: call.location.end_line
    -    }
    +  repository = repository.merge(
    +    url: repo_url,
    +    name: repo_name,
    +    slug: repo_slug,
    +    package_path: package_path,
    +    package_source_url: package_source_url
    +  )
    +  resources = repository[:resource_urls].is_a?(Hash) ? repository[:resource_urls] : repository_resource_urls(repository)
    +  resource_url = lambda do |key, fallback|
    +    value = resources[key].to_s
    +    value.empty? ? fallback : value
       end
    +
    +  gitlab_source = repository[:gitlab_package_source_url].to_s
    +  codeberg_source = repository[:codeberg_package_source_url].to_s
    +  gitlab_source = "https://gitlab.com/#{repo_slug}/" if gitlab_source.empty?
    +  codeberg_source = "https://codeberg.org/#{repo_slug}" if codeberg_source.empty?
    +  checksums_url = repository[:checksums_url].to_s
    +  checksums_url = "https://gitlab.com/#{repo_slug}/-/tree/main/checksums" if checksums_url.empty?
    +
    +  {
    +    "KJ|README:REPO_SLUG" => repo_slug,
    +    "KJ|README:REPO_NAME" => repo_name,
    +    "KJ|README:PACKAGE_PATH" => package_path,
    +    "KJ|README:GH_REPOSITORY_URL" => resource_url.call(:github_repository_url, repo_url),
    +    "KJ|README:GH_PACKAGE_SOURCE_URL" => resource_url.call(:github_package_source_url, package_source_url),
    +    "KJ|README:GH_RELEASES_URL" => resource_url.call(:github_releases_url, "#{repo_url}/releases"),
    +    "KJ|README:GH_TAG_BADGE_REPO" => repo_slug,
    +    "KJ|README:GH_ACTIONS_URL" => resource_url.call(:github_actions_url, "#{repo_url}/actions"),
    +    "KJ|README:GH_DISCUSSIONS_URL" => resource_url.call(:github_discussions_url, "#{repo_url}/discussions"),
    +    "KJ|README:GH_ISSUES_URL" => resource_url.call(:github_issues_url, "#{repo_url}/issues"),
    +    "KJ|README:GH_PULLS_URL" => resource_url.call(:github_pulls_url, "#{repo_url}/pulls"),
    +    "KJ|README:GH_WIKI_URL" => resource_url.call(:github_wiki_url, "#{repo_url}/wiki"),
    +    "KJ|README:GH_CODEQL_URL" => resource_url.call(:github_codeql_url, "#{repo_url}/security/code-scanning"),
    +    "KJ|README:GH_CONTRIBUTORS_URL" => resource_url.call(:github_contributors_url, "#{repo_url}/graphs/contributors"),
    +    "KJ|README:GH_CONTRIBUTING_URL" => resource_url.call(:github_contributing_url, source_blob_url(repo_url, "CONTRIBUTING.md")),
    +    "KJ|README:GH_CHANGELOG_URL" => resource_url.call(:github_changelog_url, source_blob_url(repo_url, "CHANGELOG.md")),
    +    "KJ|README:GH_SECURITY_URL" => resource_url.call(:github_security_url, source_blob_url(repo_url, "SECURITY.md")),
    +    "KJ|README:GH_CODE_OF_CONDUCT_URL" => resource_url.call(:github_code_of_conduct_url, source_blob_url(repo_url, "CODE_OF_CONDUCT.md")),
    +    "KJ|README:GH_RUBOCOP_URL" => resource_url.call(:github_rubocop_url, source_blob_url(repo_url, "RUBOCOP.md")),
    +    "KJ|README:GH_IRP_URL" => resource_url.call(:github_irp_url, source_blob_url(repo_url, "IRP.md")),
    +    "KJ|README:GL_REPOSITORY_URL" => resource_url.call(:gitlab_repository_url, "https://gitlab.com/#{repo_slug}"),
    +    "KJ|README:GL_PACKAGE_SOURCE_URL" => resource_url.call(:gitlab_package_source_url, gitlab_source),
    +    "KJ|README:GL_ISSUES_URL" => resource_url.call(:gitlab_issues_url, gitlab_repo_url(repository, repo_slug, "issues")),
    +    "KJ|README:GL_PULLS_URL" => resource_url.call(:gitlab_pulls_url, gitlab_repo_url(repository, repo_slug, "merge_requests")),
    +    "KJ|README:GL_WIKI_URL" => resource_url.call(:gitlab_wiki_url, gitlab_repo_url(repository, repo_slug, "wikis/home")),
    +    "KJ|README:GL_CONTRIBUTORS_URL" => resource_url.call(:gitlab_contributors_url, gitlab_repo_url(repository, repo_slug, "graphs/main")),
    +    "KJ|README:GL_CONTRIBUTING_URL" => resource_url.call(:gitlab_contributing_url, source_blob_url("https://gitlab.com/#{repo_slug}", "CONTRIBUTING.md")),
    +    "KJ|README:GL_CHANGELOG_URL" => resource_url.call(:gitlab_changelog_url, source_blob_url("https://gitlab.com/#{repo_slug}", "CHANGELOG.md")),
    +    "KJ|README:GL_CODE_OF_CONDUCT_URL" => resource_url.call(:gitlab_code_of_conduct_url, source_blob_url("https://gitlab.com/#{repo_slug}", "CODE_OF_CONDUCT.md")),
    +    "KJ|README:CB_REPOSITORY_URL" => resource_url.call(:codeberg_repository_url, "https://codeberg.org/#{repo_slug}"),
    +    "KJ|README:CB_PACKAGE_SOURCE_URL" => resource_url.call(:codeberg_package_source_url, codeberg_source),
    +    "KJ|README:CB_ISSUES_URL" => resource_url.call(:codeberg_issues_url, codeberg_repo_url(repository, repo_slug, "issues")),
    +    "KJ|README:CB_PULLS_URL" => resource_url.call(:codeberg_pulls_url, codeberg_repo_url(repository, repo_slug, "pulls")),
    +    "KJ|README:CODECOV_URL" => resource_url.call(:codecov_url, "https://codecov.io/gh/#{repo_slug}"),
    +    "KJ|README:CODECOV_BADGE_URL" => resource_url.call(:codecov_badge_url, "https://codecov.io/gh/#{repo_slug}/graph/badge.svg"),
    +    "KJ|README:CODECOV_GRAPH_URL" => resource_url.call(:codecov_graph_url, "https://codecov.io/gh/#{repo_slug}/graph/badge.svg"),
    +    "KJ|README:COVERALLS_URL" => resource_url.call(:coveralls_url, "https://coveralls.io/github/#{repo_slug}?branch=main"),
    +    "KJ|README:COVERALLS_BADGE_URL" => resource_url.call(:coveralls_badge_url, "https://coveralls.io/repos/github/#{repo_slug}/badge.svg?branch=main"),
    +    "KJ|README:QLTY_PROJECT_URL" => resource_url.call(:qlty_project_url, "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}"),
    +    "KJ|README:QLTY_MAINTAINABILITY_URL" => resource_url.call(:qlty_maintainability_url, "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/maintainability.svg"),
    +    "KJ|README:QLTY_COVERAGE_URL" => resource_url.call(:qlty_coverage_url, "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/metrics/code?sort=coverageRating"),
    +    "KJ|README:QLTY_COVERAGE_BADGE_URL" => resource_url.call(:qlty_coverage_badge_url, "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/coverage.svg"),
    +    "KJ|CHANGELOG:GL_COMPARE_URL" => resource_url.call(:gitlab_compare_url, "https://gitlab.com/#{repo_slug}/-/compare"),
    +    "KJ|CHANGELOG:GL_TAGS_URL" => resource_url.call(:gitlab_tags_url, "https://gitlab.com/#{repo_slug}/-/tags"),
    +    "KJ|README:CONTRIBUTORS_IMAGE_REPO" => repo_slug,
    +    "KJ|README:STAR_HISTORY_REPO" => repo_slug,
    +    "KJ|README:SHA_CHECKSUMS_URL" => resource_url.call(:checksums_url, checksums_url)
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 10997
    +      
    # File 'lib/kettle/jem.rb', line 5448
     
    -def rakefile_require_records(content)
    -  top_level_ruby_call_records(content, :require).filter_map do |call|
    -    name = ruby_string_argument(call)
    -    next unless name
    +def readme_workflow_path_from_url(url)
    +  marker = "/actions/workflows/"
    +  path = URI.parse(url.to_s).path.to_s
    +  marker_index = path.index(marker)
    +  return "" unless marker_index
     
    -    {
    -      name: name,
    -      start_line: call.location.start_line,
    -      end_line: call.location.end_line
    -    }
    -  end
    +  workflow = path[(marker_index + marker.length)..].to_s.split("/").first.to_s
    +  workflow.empty? ? "" : ".github/workflows/#{workflow}"
    +rescue URI::InvalidURIError
    +  ""
     end
    -
    # File 'lib/kettle/jem.rb', line 3944
    -
    -def rakefile_scaffold_cleanup(content, facts)
    -  return {content: content.to_s, delete_selectors: []} if facts[:template_profile].to_s == MONOREPO_ROOT_TEMPLATE_PROFILE
    +      
    # File 'lib/kettle/jem.rb', line 12740
     
    -  delete_rakefile_scaffold(content)
    +def readme_workflow_paths(project_root)
    +  Dir.glob(File.join(project_root.to_s, ".github/workflows/*.{yml,yaml}")).map do |path|
    +    ".github/workflows/#{File.basename(path)}"
    +  end.sort
     end
    +
    @@ -40118,9 +56678,9 @@

    -

    +

    - .rakefile_scaffold_delete_selectors(content) ⇒ Object + .recipe_decision_diagnostics(recipe) ⇒ Object @@ -40132,73 +56692,29 @@

     
     
    -10964
    -10965
    -10966
    -10967
    -10968
    -10969
    -10970
    -10971
    -10972
    -10973
    -10974
    -10975
    -10976
    -10977
    -10978
    -10979
    -10980
    -10981
    -10982
    -10983
    -10984
    -10985
    -10986
    -10987
    -10988
    -10989
    -10990
    -10991
    -10992
    -10993
    -10994
    -10995
    +9595 +9596 +9597 +9598 +9599 +9600 +9601 +9602 +9603 +9604

    @@ -40206,9 +56722,9 @@

    -

    +

    - .rakefile_selector(selector_id, start_line, end_line, reason) ⇒ Object + .recipe_decision_evaluation(decision_policy:, recipe:, changed:, destination_existed:) ⇒ Object @@ -40220,27 +56736,29 @@

     
     
    -11082
    -11083
    -11084
    -11085
    -11086
    -11087
    -11088
    -11089
    -11090
    +9566 +9567 +9568 +9569 +9570 +9571 +9572 +9573 +9574 +9575

    @@ -40248,9 +56766,9 @@

    -

    +

    - .rakefile_task_block_selectors(content) ⇒ Object + .recipe_default_action(recipe, changed:, destination_existed:) ⇒ Object @@ -40262,33 +56780,25 @@

     
     
    -11023
    -11024
    -11025
    -11026
    -11027
    -11028
    -11029
    -11030
    -11031
    -11032
    -11033
    -11034
    +9586 +9587 +9588 +9589 +9590 +9591 +9592 +9593

    @@ -40296,9 +56806,9 @@

    -

    +

    - .rakefile_task_class_records(content) ⇒ Object + .recipe_entry(name, target_path, provider_family, primitive, facts:, provider_backend: nil, selectors: []) ⇒ Object @@ -40310,33 +56820,31 @@

     
     
    -11010
    -11011
    -11012
    -11013
    -11014
    -11015
    -11016
    -11017
    -11018
    -11019
    -11020
    -11021
    +9628 +9629 +9630 +9631 +9632 +9633 +9634 +9635 +9636 +9637 +9638

    @@ -40344,62 +56852,383 @@

    -

    +

    - .rakefile_template_default_task?(content, record) ⇒ Boolean + .recipe_filter_patterns(template_selection) ⇒ Object -

    -
    - +

     
     
    -3940
    -3941
    -3942
    +9577 +9578 +9579 +9580 +9581 +9582 +9583 +9584
    -
    # File 'lib/kettle/jem.rb', line 3940
    +      
    # File 'lib/kettle/jem.rb', line 9577
    +
    +def recipe_decision_category(recipe)
    +  return "delete_file" if delete_file_recipe?(recipe)
    +  return "select_template_source" if recipe.fetch(:primitive) == "supplied_template_source_preference"
    +  return "bootstrap_config" if recipe.fetch(:primitive) == "supplied_kettle_config_bootstrap"
    +  return "apply_template_source" if recipe.fetch(:primitive) == "supplied_template_source_application"
     
    -def rakefile_scaffold_cleanup_recipe?(recipe)
    -  recipe.fetch(:name) == "rakefile_scaffold_cleanup"
    +  "merge_valid_document"
     end
    -
    # File 'lib/kettle/jem.rb', line 10964
    -
    -def rakefile_scaffold_delete_selectors(content)
    -  selectors = []
    -
    -  rakefile_require_records(content).each do |record|
    -    selector_id = case record.fetch(:name)
    -    when "bundler/gem_tasks"
    -      "rakefile_scaffold_require_bundler_gem_tasks"
    -    when "rspec/core/rake_task"
    -      "rakefile_scaffold_require_rspec_core_rake_task"
    -    when "rubocop/rake_task"
    -      "rakefile_scaffold_require_rubocop_rake_task"
    -    end
    -    next unless selector_id
    +      
    # File 'lib/kettle/jem.rb', line 9595
     
    -    selectors << rakefile_selector(selector_id, record.fetch(:start_line), record.fetch(:end_line), "wrapper_selected_scaffold_require")
    +def recipe_decision_diagnostics(recipe)
    +  diagnostics = []
    +  if recipe.fetch(:primitive) == "supplied_template_source_application"
    +    diagnostics << "Non-interactive runs apply the configured template source default and report the decision."
       end
    -
    -  rakefile_task_class_records(content).each do |record|
    -    selector_id = case record.fetch(:receiver)
    -    when "RSpec::Core::RakeTask"
    -      "rakefile_scaffold_rspec_task"
    -    when "RuboCop::RakeTask"
    -      "rakefile_scaffold_rubocop_task"
    -    end
    -    next unless selector_id
    -
    -    selectors << rakefile_selector(selector_id, record.fetch(:start_line), record.fetch(:end_line), "wrapper_selected_scaffold_task")
    +  if delete_file_recipe?(recipe)
    +    diagnostics << "Deletion is allowed only for explicit Kettle/Jem cleanup primitives."
       end
    -
    -  selectors.concat(rakefile_task_block_selectors(content))
    -  selectors.sort_by { |selector| [selector.fetch(:start_line), selector.fetch(:end_line)] }
    +  diagnostics
     end
    -
    # File 'lib/kettle/jem.rb', line 11082
    +      
    # File 'lib/kettle/jem.rb', line 9566
     
    -def rakefile_selector(selector_id, start_line, end_line, reason)
    -  {
    -    selector_id: selector_id,
    -    selector_family: "structural_owner_range",
    -    start_line: start_line,
    -    end_line: end_line,
    -    reason: reason
    -  }
    +def recipe_decision_evaluation(decision_policy:, recipe:, changed:, destination_existed:)
    +  decision_policy.resolve(
    +    id: "recipe:#{recipe.fetch(:name)}",
    +    category: recipe_decision_category(recipe),
    +    file: recipe.fetch(:target_path),
    +    default_action: recipe_default_action(recipe, changed: changed, destination_existed: destination_existed),
    +    severity: :advisory,
    +    diagnostics: recipe_decision_diagnostics(recipe)
    +  ).to_h
     end
    -
    # File 'lib/kettle/jem.rb', line 11023
    +      
    # File 'lib/kettle/jem.rb', line 9586
     
    -def rakefile_task_block_selectors(content)
    -  rakefile_default_task_records(content).filter_map do |record|
    -    next if rakefile_template_default_task?(content, record)
    +def recipe_default_action(recipe, changed:, destination_existed:)
    +  return "delete" if delete_file_recipe?(recipe)
    +  return "keep" unless changed
    +  return "create" unless destination_existed
    +  return "replace" if recipe.fetch(:primitive) == "supplied_template_source_application"
     
    -    rakefile_selector(
    -      "rakefile_scaffold_task_default",
    -      record.fetch(:start_line),
    -      record.fetch(:end_line),
    -      "wrapper_selected_scaffold_task"
    -    )
    -  end
    +  "merge"
     end
    -
    # File 'lib/kettle/jem.rb', line 11010
    +      
    # File 'lib/kettle/jem.rb', line 9628
     
    -def rakefile_task_class_records(content)
    -  top_level_ruby_call_records(content, :new).filter_map do |call|
    -    receiver = call.receiver&.slice
    -    next unless %w[RSpec::Core::RakeTask RuboCop::RakeTask].include?(receiver)
    -
    -    {
    -      receiver: receiver,
    -      start_line: call.location.start_line,
    -      end_line: call.location.end_line
    -    }
    -  end
    +def recipe_entry(name, target_path, provider_family, primitive, facts:, provider_backend: nil, selectors: [])
    +  {
    +    name: name,
    +    target_path: target_path,
    +    provider_family: provider_family,
    +    provider_backend: provider_backend,
    +    primitive: primitive,
    +    facts: facts,
    +    selectors: selectors
    +  }
     end
    + + + + +
    +
     
     
    -  
    +9550
    +9551
    +9552
    +9553
    +9554
    +
    +
    # File 'lib/kettle/jem.rb', line 9550
    +
    +def recipe_filter_patterns(template_selection)
    +  only = Array(template_selection[:only]).compact
    +  include = Array(template_selection[:include]).compact
    +  only.empty? ? [] : (only + include)
    +end
    +
    -
    + +
    +

    -

    Returns:

    -
      + .recipe_pack(facts) ⇒ Object -
    • - - - (Boolean) - - - -
    • + -
    -

    + +
    @@ -40407,9 +57236,9 @@

    -

    +

    - .rbs_merge_options(recipe) ⇒ Object + .recipe_report_metadata(recipe) ⇒ Object @@ -40421,33 +57250,27 @@

     
     
    -5796
    -5797
    -5798
    -5799
    -5800
    -5801
    -5802
    -5803
    -5804
    -5805
    -5806
    -5807
    +9470 +9471 +9472 +9473 +9474 +9475 +9476 +9477 +9478

    @@ -40455,9 +57278,9 @@

    -

    +

    - .read_project_file(project_root, relative_path) ⇒ Object + .recipe_report_phase(recipe_report) ⇒ Object @@ -40469,17 +57292,15 @@

     
     
    -8929
    -8930
    -8931
    -8932
    +10116 +10117 +10118

    @@ -40487,9 +57308,9 @@

    -

    +

    - .read_project_files(project_root, pack) ⇒ Object + .recipe_run_stats(recipe_reports, diagnostics: []) ⇒ Object @@ -40501,55 +57322,75 @@

     
     
    -4149
    -4150
    -4151
    -4152
    -4153
    -4154
    -4155
    +10148 +10149 +10150 +10151 +10152 +10153 +10154 +10155 +10156 +10157 +10158 +10159 +10160 +10161 +10162 +10163 +10164 +10165 +10166 +10167 +10168 +10169 +10170 +10171 +10172 +10173 +10174 +10175 +10176 +10177 +10178 +10179 +10180

    - -
     
     
    -11059
    -11060
    -11061
    -11062
    -11063
    -11064
    -11065
    -11066
    +3084 +3085 +3086 +3087 +3088 +3089 +3090 +3091 +3092 +3093 +3094 +3095 +3096 +3097 +3098 +3099 +3100 +3101 +3102 +3103 +3104 +3105 +3106 +3107 +3108 +3109 +3110 +3111 +3112 +3113 +3114 +3115 +3116 +3117 +3118 +3119 +3120 +3121 +3122 +3123 +3124 +3125 +3126 +3127 +3128 +3129 +3130 +3131 +3132 +3133 +3134 +3135 +3136 +3137 +3138 +3139 +3140 +3141 +3142 +3143 +3144 +3145 +3146 +3147 +3148 +3149 +3150 +3151 +3152 +3153 +3154 +3155 +3156 +3157 +3158 +3159 +3160 +3161 +3162 +3163 +3164 +3165 +3166 +3167 +3168 +3169 +3170 +3171 +3172 +3173 +3174 +3175 +3176 +3177 +3178 +3179 +3180 +3181 +3182 +3183 +3184 +3185 +3186 +3187 +3188 +3189 +3190 +3191 +3192 +3193 +3194 +3195 +3196 +3197 +3198 +3199 +3200 +3201 +3202 +3203 +3204 +3205 +3206 +3207 +3208 +3209 +3210 +3211 +3212 +3213 +3214 +3215 +3216 +3217 +3218 +3219 +3220 +3221 +3222 +3223 +3224 +3225 +3226 +3227 +3228 +3229 +3230 +3231 +3232 +3233 +3234 +3235 +3236 +3237 +3238 +3239 +3240 +3241 +3242 +3243 +3244 +3245 +3246
    -
    # File 'lib/kettle/jem.rb', line 11059
    +      
    # File 'lib/kettle/jem.rb', line 3084
     
    -def rakefile_template_default_task?(content, record)
    -  desc_lines = top_level_ruby_call_records(content, :desc).filter_map do |call|
    -    next unless ruby_string_argument(call) == "Default tasks aggregator"
    -
    -    call.location.start_line
    +def recipe_pack(facts)
    +  recipes = if monorepo_template_profile?(facts) || shim_template_profile?(facts)
    +    []
    +  else
    +    [
    +      recipe_entry("readme_metadata", "README.md", "markdown", "supplied_readme_metadata_synchronization", facts: %w[package funding readme]),
    +      recipe_entry("changelog_unreleased", "CHANGELOG.md", "markdown", "changelog_unreleased_normalization", facts: %w[package changelog]),
    +      recipe_entry(
    +        "generated_block_sync",
    +        "gemfiles/modular/shunted.gemfile",
    +        "ruby",
    +        "supplied_managed_text_block_replacement",
    +        facts: %w[package generated_blocks],
    +        provider_backend: "ast-crispr-ruby-prism"
    +      ),
    +      recipe_entry(
    +        "github_funding_yml",
    +        ".github/FUNDING.yml",
    +        "yaml",
    +        "supplied_github_funding_yaml_synchronization",
    +        facts: %w[package funding]
    +      )
    +    ]
    +  end
    +  if facts[:kettle_config_bootstrap]
    +    recipes.unshift(kettle_config_bootstrap_recipe(facts.fetch(:kettle_config_bootstrap)))
    +  end
    +  unless monorepo_template_profile?(facts) || shim_template_profile?(facts)
    +    facts.dig(:ci, :framework_matrix, :gemfiles).to_a.each do |gemfile|
    +      recipes << recipe_entry(
    +        "github_actions_framework_gemfile_#{workflow_recipe_slug(gemfile.fetch(:path))}",
    +        gemfile.fetch(:path),
    +        "ruby",
    +        "supplied_framework_matrix_gemfile_generation",
    +        facts: %w[ci]
    +      )
    +    end
    +    facts.dig(:ci, :obsolete_workflows).to_a.each do |workflow_path|
    +      recipes << recipe_entry(
    +        "github_actions_obsolete_workflow_cleanup_#{workflow_recipe_slug(workflow_path)}",
    +        workflow_path,
    +        "file",
    +        "supplied_obsolete_file_deletion",
    +        facts: %w[ci]
    +      )
    +    end
    +    facts.dig(:ci, :opt_in_workflow_cleanups).to_a.each do |workflow_path|
    +      recipes << recipe_entry(
    +        "github_actions_opt_in_workflow_cleanup_#{workflow_recipe_slug(workflow_path)}",
    +        workflow_path,
    +        "file",
    +        "supplied_opt_in_workflow_deletion",
    +        facts: %w[ci]
    +      )
    +    end
    +    facts.dig(:ci, :inactive_packaged_workflow_cleanups).to_a.each do |workflow_path|
    +      recipes << recipe_entry(
    +        "github_actions_inactive_packaged_workflow_cleanup_#{workflow_recipe_slug(workflow_path)}",
    +        workflow_path,
    +        "file",
    +        "supplied_inactive_packaged_workflow_deletion",
    +        facts: %w[ci]
    +      )
    +    end
    +    facts.dig(:funding, :open_collective_files).to_a.each do |relative_path|
    +      recipes << recipe_entry(
    +        "opencollective_disabled_file_cleanup_#{workflow_recipe_slug(relative_path)}",
    +        relative_path,
    +        "file",
    +        "supplied_disabled_opencollective_file_deletion",
    +        facts: %w[funding]
    +      )
    +    end
    +    facts.dig(:ci, :custom_workflows).to_a.each do |workflow_path|
    +      recipes << recipe_entry(
    +        "github_actions_workflow_snippets_#{workflow_recipe_slug(workflow_path)}",
    +        workflow_path,
    +        "yaml",
    +        "supplied_github_actions_workflow_snippet_merge",
    +        facts: %w[ci]
    +      )
    +    end
    +  end
    +  if monorepo_template_profile?(facts)
    +    facts.dig(:ci, :inactive_packaged_workflow_cleanups).to_a.each do |workflow_path|
    +      recipes << recipe_entry(
    +        "github_actions_inactive_packaged_workflow_cleanup_#{workflow_recipe_slug(workflow_path)}",
    +        workflow_path,
    +        "file",
    +        "supplied_inactive_packaged_workflow_deletion",
    +        facts: %w[ci]
    +      )
    +    end
    +  end
    +  facts.dig(:templates, :source_preferences).to_a.each do |preference|
    +    apply_template = preference.fetch(:apply, false)
    +    recipe = recipe_entry(
    +      "#{apply_template ? "template_source_application" : "template_source_preference"}_#{workflow_recipe_slug(preference.fetch(:target_path))}",
    +      preference.fetch(:target_path),
    +      "file",
    +      apply_template ? "supplied_template_source_application" : "supplied_template_source_preference",
    +      facts: %w[templates funding]
    +    )
    +    recipe[:template_preference] = preference
    +    recipe[:template_tokens] = facts.dig(:templates, :tokens) if facts.dig(:templates, :tokens)
    +    recipe[:readme_style] = facts[:readme_style] if preference.fetch(:target_path) == "README.md" && facts[:readme_style]
    +    recipes << recipe
    +  end
    +  facts.dig(:templates, :inactive_packaged_template_cleanups).to_a.each do |cleanup|
    +    recipes << recipe_entry(
    +      "template_inactive_packaged_cleanup_#{workflow_recipe_slug(cleanup.fetch(:target_path))}",
    +      cleanup.fetch(:target_path),
    +      "file",
    +      "supplied_inactive_packaged_template_deletion",
    +      facts: %w[templates]
    +    )
    +  end
    +  facts.dig(:templates, :legacy_destination_cleanups).to_a.each do |cleanup|
    +    recipes << recipe_entry(
    +      "template_legacy_destination_cleanup_#{workflow_recipe_slug(cleanup.fetch(:legacy_path))}",
    +      cleanup.fetch(:legacy_path),
    +      "file",
    +      "supplied_legacy_destination_file_deletion",
    +      facts: %w[templates]
    +    )
       end
    -  desc_lines.include?(previous_nonblank_line_number(content, record.fetch(:start_line)))
    +  facts.dig(:templates, :obsolete_license_cleanups).to_a.each do |cleanup|
    +    recipes << recipe_entry(
    +      "template_obsolete_license_cleanup_#{workflow_recipe_slug(cleanup.fetch(:license_path))}",
    +      cleanup.fetch(:license_path),
    +      "file",
    +      "supplied_obsolete_license_file_deletion",
    +      facts: %w[templates license]
    +    )
    +  end
    +  facts.dig(:templates, :shim_profile_cleanups).to_a.each do |cleanup|
    +    recipes << recipe_entry(
    +      "template_shim_profile_cleanup_#{workflow_recipe_slug(cleanup.fetch(:target_path))}",
    +      cleanup.fetch(:target_path),
    +      "file",
    +      "supplied_shim_profile_file_deletion",
    +      facts: %w[templates shim]
    +    )
    +  end
    +  unless shim_template_profile?(facts)
    +    recipes << recipe_entry(
    +      "rakefile_scaffold_cleanup",
    +      "Rakefile",
    +      "generic_ast",
    +      "supplied_source_selector_deletion",
    +      provider_backend: "generic_structural_owners",
    +      facts: %w[rubygems rakefile],
    +      selectors: %w[rakefile_scaffold]
    +    )
    +  end
    +
    +  {
    +    name: "kettle-jem-core",
    +    version: 1,
    +    ecosystem: "rubygems",
    +    recipes: recipes
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 5796
    +      
    # File 'lib/kettle/jem.rb', line 9470
     
    -def rbs_merge_options(recipe)
    -  options = {
    -    preference: (recipe.dig(:template_preference, :preference) || "destination").to_sym,
    -    add_template_only_nodes: true,
    -    freeze_token: recipe.dig(:template_preference, :freeze_token) || "kettle-jem"
    -  }
    -  if !recipe.dig(:template_preference, :add_template_only_nodes).nil?
    -    configured = DecisionPolicy.value_to_boolean(recipe.dig(:template_preference, :add_template_only_nodes))
    -    options[:add_template_only_nodes] = configured unless configured.nil?
    -  end
    -  options
    +def (recipe)
    +   = {packaging_recipe: recipe.fetch(:name)}
    +  [:delete_file] = true if delete_file_recipe?(recipe)
    +  [:template_source_preference] = deep_dup(recipe[:template_preference]) if recipe[:template_preference]
    +  [:template_tokens] = deep_dup(recipe[:template_tokens]) if recipe[:template_tokens]
    +  [:readme_style] = deep_dup(recipe[:readme_style]) if recipe[:readme_style]
    +  [:bootstrap_file] = true if recipe.fetch(:primitive) == "supplied_kettle_config_bootstrap"
    +  
     end
    -
    # File 'lib/kettle/jem.rb', line 8929
    +      
    # File 'lib/kettle/jem.rb', line 10116
     
    -def read_project_file(project_root, relative_path)
    -  path = File.join(project_root, relative_path)
    -  File.file?(path) ? File.read(path) : ""
    +def recipe_report_phase(recipe_report)
    +  phase_for_recipe(recipe_report[:recipe_name], recipe_report[:relative_path])
     end
    -
    # File 'lib/kettle/jem.rb', line 4149
    -
    -def read_project_files(project_root, pack)
    -  pack.fetch(:recipes).to_h do |recipe|
    -    relative_path = recipe.fetch(:target_path)
    -    path = File.join(project_root, relative_path)
    -    [relative_path, File.exist?(path) ? File.read(path) : ""]
    -  end
    -end
    -
    -
    - -
    -

    - - .readme_config_hash(config) ⇒ Object - - - +
    # File 'lib/kettle/jem.rb', line 10148
     
    -  
    -

    - - - @@ -40557,9 +57398,9 @@

    -

    - .readme_copyright_notice(copyright_lines, copyright_prefix, author) ⇒ Object + .recipe_run_stats_summary(stats) ⇒ Object @@ -40571,45 +57412,41 @@

    -
    +def recipe_run_stats(recipe_reports, diagnostics: [])
    +  stats = {
    +    recipes: recipe_reports.length,
    +    created: 0,
    +    pre_existing: 0,
    +    identical: 0,
    +    changed: 0,
    +    deleted: 0,
    +    plugin_file_changes: diagnostics.count { |diagnostic| diagnostic[:kind] == "plugin_file_change" }
    +  }
     
    +  recipe_reports.each do |report|
    +     = report.fetch(:metadata, {})
    +    if [:delete_file]
    +      stats[:deleted] += 1 if report[:changed]
    +      next
    +    end
     
    -9222
    -9223
    -9224
    -9225
    -
    -
    # File 'lib/kettle/jem.rb', line 9222
    +    if [:destination_existed]
    +      stats[:pre_existing] += 1
    +      if report[:changed]
    +        stats[:changed] += 1
    +      else
    +        stats[:identical] += 1
    +      end
    +    elsif report[:changed]
    +      stats[:created] += 1
    +    end
    +  end
     
    -def readme_config_hash(config)
    -  raw_config = config.is_a?(Hash) ? config["readme"] : nil
    -  raw_config.is_a?(Hash) ? raw_config : {}
    +  stats[:summary] = recipe_run_stats_summary(stats)
    +  stats
     end
    -
    # File 'lib/kettle/jem.rb', line 9562
    +      
    # File 'lib/kettle/jem.rb', line 10182
     
    -def readme_copyright_notice(copyright_lines, copyright_prefix, author)
    -  lines = copyright_notice_lines(copyright_lines, copyright_prefix, author).map { |line| "- #{line}" }
    -  <<~MARKDOWN.chomp
    -    See [LICENSE.md][#{paperclip_ref(:license)}] for the official copyright notice.
    -
    -    <details markdown="1">
    -    <summary>Copyright holders</summary>
    -
    -    #{lines.join("\n")}
    -
    -    </details>
    -  MARKDOWN
    -end
    +def recipe_run_stats_summary(stats) + [ + "recipes #{stats.fetch(:recipes)}", + "created #{stats.fetch(:created)}", + "pre_existing #{stats.fetch(:pre_existing)}", + "identical #{stats.fetch(:identical)}", + "changed #{stats.fetch(:changed)}", + "deleted #{stats.fetch(:deleted)}", + "plugin_file_changes #{stats.fetch(:plugin_file_changes)}" + ].join(" ") +end
    -

    +

    - .readme_default_logo_width(entries, one:, two:) ⇒ Object + .recipe_runtime_context(recipe, facts, deletion) ⇒ Object @@ -40621,25 +57458,29 @@

     
     
    -9426
    -9427
    -9428
    -9429
    -9430
    -9431
    -9432
    -9433
    +9640 +9641 +9642 +9643 +9644 +9645 +9646 +9647 +9648 +9649 -
    # File 'lib/kettle/jem.rb', line 9426
    +      
    # File 'lib/kettle/jem.rb', line 9640
     
    -def readme_default_logo_width(entries, one:, two:)
    -  case entries.length
    -  when 1
    -    one
    -  when 2
    -    two
    +def recipe_runtime_context(recipe, facts, deletion)
    +  context = deep_dup(facts)
    +  if recipe.fetch(:primitive) == "supplied_source_selector_deletion" && deletion
    +    context[:delete_selectors] = deletion.fetch(:delete_selectors)
       end
    +  context[:template_source_preference] = deep_dup(recipe[:template_preference]) if recipe[:template_preference]
    +  context[:template_tokens] = deep_dup(recipe[:template_tokens]) if recipe[:template_tokens]
    +  context[:readme_style] = deep_dup(recipe[:readme_style]) if recipe[:readme_style]
    +  context
     end
    @@ -40647,9 +57488,9 @@

    -

    +

    - .readme_destination_front_sections(destination_content) ⇒ Object + .recipe_template_content(project_root, recipe) ⇒ Object @@ -40661,35 +57502,37 @@

     
     
    -10003
    -10004
    -10005
    -10006
    -10007
    -10008
    -10009
    -10010
    -10011
    -10012
    -10013
    -10014
    -10015
    +4858 +4859 +4860 +4861 +4862 +4863 +4864 +4865 +4866 +4867 +4868 +4869 +4870 +4871 -
    # File 'lib/kettle/jem.rb', line 10003
    +      
    # File 'lib/kettle/jem.rb', line 4858
     
    -def readme_destination_front_sections(destination_content)
    -  sections = markdown_sections(destination_content)
    -  h1 = sections.find { |section| section.fetch(:level) == 1 }
    -  synopsis = sections.find { |section| section.fetch(:level) == 2 && section.fetch(:base) == "synopsis" }
    -  return [] unless h1 && synopsis
    +def recipe_template_content(project_root, recipe)
    +  return "" unless %w[
    +    supplied_kettle_config_bootstrap
    +    supplied_template_source_preference
    +    supplied_template_source_application
    +  ].include?(recipe.fetch(:primitive))
     
    -  sections.select do |section|
    -    section.fetch(:level) == 2 &&
    -      section.fetch(:start) > h1.fetch(:start) &&
    -      section.fetch(:end) < synopsis.fetch(:start) &&
    -      readme_front_section_preserved?(section)
    -  end
    +  preference = recipe.fetch(:template_preference)
    +  path = File.join(
    +    preference.fetch(:source_root_path, project_root),
    +    preference.fetch(:source_relative_path, preference.fetch(:selected_source))
    +  )
    +  File.read(path)
     end
    @@ -40697,97 +57540,68 @@

    -

    +

    - .readme_disabled_integrations(readme) ⇒ Object + .redundant_templating_guard_wrapper_node?(node) ⇒ Boolean -

    - - - - -
    -
    -
    +
    +
    + -9921 -9922 -9923 -9924 -9925 -9926 -9927 -9928 -9929 -9930
    -
    -
    # File 'lib/kettle/jem.rb', line 9921
     
    -def readme_disabled_integrations(readme)
    -  disabled = []
    -  integrations = readme["integrations"].is_a?(Hash) ? readme["integrations"] : {}
    -  badges = readme["badges"].is_a?(Hash) ? readme["badges"] : {}
    -  integrations.each do |name, value|
    -    disabled << name.to_s if falsey_config?(value)
    -  end
    -  disabled.concat(Array(badges["disabled"]).map(&:to_s))
    -  disabled.map { |name| name.tr("_", "-").downcase }.map { |name| (name == "code-ql") ? "codeql" : name }.uniq & README_INTEGRATIONS
    -end
    -
    +
    - -
    -

    +
    - .readme_extra_preserved_sections_by_anchor(destination_sections, template_bases, preserve_targets) ⇒ Object +

    Returns:

    +
      - +
    • + + + (Boolean) + + + +
    • +
    - -

    +
    @@ -40795,9 +57609,9 @@

    -

    +

    - .readme_family_intro_and_backend_matrix(readme_style = {}) ⇒ Object + .remove_duplicate_gemspec_assignments(content, receiver:, fields:) ⇒ Object @@ -40809,106 +57623,55 @@

     
     
    -8113
    -8114
    -8115
    -8116
    -8117
    -8118
    -8119
    -8120
    -8121
    -8122
    -8123
    -8124
    -8125
    -8126
    -8127
    -8128
    -8129
    -8130
    -8131
    - -

    - -
     
     
    -10059
    -10060
    -10061
    -10062
    -10063
    -10064
    -10065
    -10066
    -10067
    -10068
    -10069
    -10070
    -10071
    -10072
    -10073
    +6063 +6064 +6065 +6066 +6067 +6068 +6069 +6070 +6071 +6072 +6073
    -
    # File 'lib/kettle/jem.rb', line 10059
    +      
    # File 'lib/kettle/jem.rb', line 6063
     
    -def readme_extra_preserved_sections_by_anchor(destination_sections, template_bases, preserve_targets)
    -  destination_sections.each_with_object({}) do |section, result|
    -    base = section.fetch(:base)
    -    next if template_bases.include?(base)
    -    next unless preserve_targets.include?(base)
    +def redundant_templating_guard_wrapper_node?(node)
    +  return false unless gemfile_conditional_node?(node)
    +  return false unless prism_subtree_contains_string?(node.predicate, "K_JEM_TEMPLATING")
     
    -    anchor = destination_sections[0...destination_sections.index(section)].reverse.find do |candidate|
    -      template_bases.include?(candidate.fetch(:base))
    -    end
    -    next unless anchor
    +  body = node.statements&.body.to_a
    +  return false unless body.length == 1
     
    -    result[anchor.fetch(:base)] ||= []
    -    result[anchor.fetch(:base)] << section
    -  end
    +  inner = body.first
    +  gemfile_conditional_node?(inner) &&
    +    prism_subtree_contains_string?(inner.predicate, "K_JEM_TEMPLATING")
     end
    -
    # File 'lib/kettle/jem.rb', line 8113
    -
    -def readme_family_intro_and_backend_matrix(readme_style = {})
    -  return "" unless readme_style.is_a?(Hash) && readme_style[:package_family].to_s == "structuredmerge"
    -
    -  [
    -    "<details markdown=\"1\">",
    -    "<summary>StructuredMerge package family</summary>",
    -    "",
    -    "This gem is part of the StructuredMerge Ruby package family. The implementation inventory, layering model, and backend notes live in the [root package-family guide][sm-family-guide]. Shared behavior is defined by the [StructuredMerge fixtures][sm-family-fixtures] and implemented by the [Go][sm-family-go], [Ruby][sm-family-ruby], [Rust][sm-family-rust], and [TypeScript][sm-family-typescript] repositories.",
    -    "",
    -    "</details>",
    -    "",
    -    "[sm-family-guide]: https://github.com/structuredmerge/structuredmerge-ruby#package-family",
    -    "[sm-family-fixtures]: https://github.com/structuredmerge/structuredmerge-fixtures",
    -    "[sm-family-go]: https://github.com/structuredmerge/structuredmerge-go",
    -    "[sm-family-ruby]: https://github.com/structuredmerge/structuredmerge-ruby",
    -    "[sm-family-rust]: https://github.com/structuredmerge/structuredmerge-rust",
    -    "[sm-family-typescript]: https://github.com/structuredmerge/structuredmerge-typescript"
    -  ].join("\n")
    -end
    +7639 +7640 +7641 +7642 +7643 +7644 +7645 +7646 +7647 +7648 +7649 +7650 +7651 +7652 +7653 +7654 +7655 +7656 +7657 +7658 +7659 +7660 +7661
    -
    - -
    -

    - - .readme_floss_funding_enabled?(license, config_value) ⇒ Boolean - - - - - -

    -
    - - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • - -
    - -
    - - @@ -40916,9 +57679,9 @@

    -

    +

    - .readme_fossa_project(readme, repository) ⇒ Object + .remove_duplicate_simplecov_do_cov_bootstrap_blocks(content) ⇒ Object @@ -40930,51 +57693,25 @@

     
     
    -9843
    -9844
    -9845
    -9846
    -9847
    -9848
    -9849
    -9850
    -9851
    -9852
    -9853
    -9854
    -9855
    -9856
    -9857
    -9858
    -9859
    -9860
    -9861
    -9862
    -9863
    +5853 +5854 +5855 +5856 +5857 +5858 +5859 +5860

    @@ -40982,9 +57719,9 @@

    -

    +

    - .readme_fossa_template_tokens(readme_style) ⇒ Object + .remove_duplicate_simplecov_requires(content) ⇒ Object @@ -40996,35 +57733,25 @@

     
     
    -8005
    -8006
    -8007
    -8008
    -8009
    -8010
    -8011
    -8012
    -8013
    -8014
    -8015
    -8016
    -8017
    +5948 +5949 +5950 +5951 +5952 +5953 +5954 +5955

    @@ -41032,52 +57759,35 @@

    -

    - - .readme_front_section_preserved?(section) ⇒ Boolean +

    - + .remove_empty_gemspec_development_dependency_section_headings(content, receiver:) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

    -
    +      
    # File 'lib/kettle/jem.rb', line 7639
     
    +def remove_duplicate_gemspec_assignments(content, receiver:, fields:)
    +  wanted = fields.map(&:to_s).to_set
    +  seen = Set.new
    +  duplicate_ranges = []
    +  gemspec_assignment_records(content, receiver: receiver).each do |record|
    +    field = record.fetch(:field).to_s
    +    next unless wanted.include?(field)
     
    -9914
    -9915
    -9916
    -9917
    -9918
    -9919
    -
    -
    # File 'lib/kettle/jem.rb', line 9914
    -
    -def readme_floss_funding_enabled?(license, config_value)
    -  return false if falsey_config?(config_value)
    -  return true if %w[true yes 1 always enabled].include?(config_value.to_s.strip.downcase)
    +    key = [record.fetch(:receiver).to_s, field, record.fetch(:value)]
    +    if seen.include?(key)
    +      duplicate_ranges << [record.fetch(:start_line), record.fetch(:end_line)]
    +    else
    +      seen << key
    +    end
    +  end
    +  return content if duplicate_ranges.empty?
     
    -  Array(license[:spdx]).map(&:to_s).include?("MIT")
    +  lines = content.to_s.lines
    +  duplicate_ranges.reverse_each do |start_line, end_line|
    +    lines.slice!(start_line - 1, end_line - start_line + 1)
    +  end
    +  ensure_trailing_newline(lines.join)
     end
    -
    # File 'lib/kettle/jem.rb', line 9843
    -
    -def readme_fossa_project(readme, repository)
    -  badges = readme["badges"].is_a?(Hash) ? readme["badges"] : {}
    -  return "" unless badges.key?("fossa")
    -
    -  value = badges["fossa"]
    -  return "" if falsey_config?(value)
    +      
    # File 'lib/kettle/jem.rb', line 5853
     
    -  project = case value
    -  when Hash
    -    return "" if falsey_config?(value["enabled"])
    +def remove_duplicate_simplecov_do_cov_bootstrap_blocks(content)
    +  records = simplecov_do_cov_bootstrap_records(content)
    +  return content if records.length <= 1
     
    -    value["project"] || value["project_id"] || value["slug"]
    -  else
    -    value
    +  records.drop(1).select { |record| record.fetch(:bootstrap_only) }.sort_by { |record| -record.fetch(:start_line) }.reduce(content.to_s) do |output, record|
    +    replace_source_range_lines(output, record.fetch(:start_line), expand_line_range_through_following_blanks(output, record.fetch(:end_line)), "")
       end
    -  normalized = project.to_s.strip
    -  return normalized unless normalized.empty? || %w[true yes 1 on enabled].include?(normalized.downcase)
    -
    -  slug = repository.is_a?(Hash) ? repository[:slug].to_s : ""
    -  slug.empty? ? "" : "git+github.com/#{slug}"
     end
    -
    # File 'lib/kettle/jem.rb', line 8005
    +      
    # File 'lib/kettle/jem.rb', line 5948
     
    -def readme_fossa_template_tokens(readme_style)
    -  project = readme_style.fetch(:fossa_project, "").to_s
    -  return {"KJ|README:FOSSA_BADGE" => "", "KJ|README:FOSSA_REFS" => ""} if project.empty?
    +def remove_duplicate_simplecov_requires(content)
    +  records = simplecov_require_call_records(content)
    +  return content if records.length <= 1
     
    -  encoded_project = URI.encode_www_form_component(project)
    -  {
    -    "KJ|README:FOSSA_BADGE" => README_FOSSA_BADGE,
    -    "KJ|README:FOSSA_REFS" => [
    -      "[🧪fossa]: https://app.fossa.com/projects/#{encoded_project}?ref=badge_shield",
    -      "[🧪fossa-img]: https://app.fossa.com/api/projects/#{encoded_project}.svg?type=shield"
    -    ].join("\n")
    -  }
    +  records.drop(1).sort_by { |record| -record.fetch(:start_line) }.reduce(content.to_s) do |output, record|
    +    replace_source_range_lines(output, record.fetch(:start_line), expand_line_range_through_following_blanks(output, record.fetch(:end_line)), "")
    +  end
     end
    +
    @@ -41085,9 +57795,9 @@

    -

    +

    - .readme_h2_synopsis_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object + .remove_gemfile_dependency_blocks(content, gem_names) ⇒ Object @@ -41099,23 +57809,43 @@

     
     
    -9267
    -9268
    -9269
    -9270
    -9271
    -9272
    -9273
    +6629 +6630 +6631 +6632 +6633 +6634 +6635 +6636 +6637 +6638 +6639 +6640 +6641 +6642 +6643 +6644 +6645

    @@ -41123,9 +57853,9 @@

    -

    +

    - .readme_h2_synopsis_logo_options(config) ⇒ Object + .remove_gemfile_dependency_lines(content, gem_names) ⇒ Object @@ -41137,15 +57867,35 @@

     
     
    -9175
    -9176
    -9177
    +6615 +6616 +6617 +6618 +6619 +6620 +6621 +6622 +6623 +6624 +6625 +6626 +6627

    @@ -41153,9 +57903,9 @@

    -

    +

    - .readme_h2_synopsis_logo_row(entries) ⇒ Object + .remove_gemfile_percent_w_entries(content, gem_names) ⇒ Object @@ -41167,21 +57917,49 @@

     
     
    -9419
    -9420
    -9421
    -9422
    -9423
    -9424
    +6806 +6807 +6808 +6809 +6810 +6811 +6812 +6813 +6814 +6815 +6816 +6817 +6818 +6819 +6820 +6821 +6822 +6823 +6824 +6825

    @@ -41189,9 +57967,9 @@

    -

    +

    - .readme_h2_synopsis_logo_specs(config) ⇒ Object + .remove_gemspec_assignment(content, receiver:, field:) ⇒ Object @@ -41203,49 +57981,25 @@

     
     
    -9179
    -9180
    -9181
    -9182
    -9183
    -9184
    -9185
    -9186
    -9187
    -9188
    -9189
    -9190
    -9191
    -9192
    -9193
    -9194
    -9195
    -9196
    -9197
    -9198
    +7584 +7585 +7586 +7587 +7588 +7589 +7590 +7591

    @@ -41253,88 +58007,43 @@

    -

    - - .readme_integration_configured?(project_root, integration) ⇒ Boolean +

    - + .remove_gemspec_dependency_lines(content, receiver:, names:, runtime_only: false) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      -
    • - - - (Boolean) - - - -
    • - -
    - -

     
     
    -10017
    -10018
    -10019
    +8421 +8422 +8423 +8424 +8425 +8426
    -
    # File 'lib/kettle/jem.rb', line 10017
    +      
    # File 'lib/kettle/jem.rb', line 8421
     
    -def readme_front_section_preserved?(section)
    -  section.fetch(:base) == "important" || readme_section_contains_badge_cloud?(section)
    +def remove_empty_gemspec_development_dependency_section_headings(content, receiver:)
    +  ensure_runtime_dependencies!
    +  target = empty_gemspec_development_dependency_sections_target(receiver: receiver)
    +  actor = Ast::Crispr::Delete.call(content: content.to_s, target: target, source_label: "gemspec")
    +  actor.updated_content
     end
    -
    # File 'lib/kettle/jem.rb', line 9267
    +      
    # File 'lib/kettle/jem.rb', line 6629
     
    -def readme_h2_synopsis_logo_entries(config, org:, gem_name:, repository: {})
    -  entries = readme_h2_synopsis_logo_specs(config).filter_map do |spec|
    -    readme_top_logo_entry_from_option(spec.fetch(:type), org: org, gem_name: gem_name, repository: repository)&.merge(width: spec[:width])
    +def remove_gemfile_dependency_blocks(content, gem_names)
    +  names = gem_names.map(&:to_s).reject(&:empty?).uniq
    +  return content if names.empty?
    +
    +  lines = content.to_s.lines
    +  remove_indexes = Set.new
    +  gemfile_gem_call_records(content).each do |record|
    +    next unless names.include?(record.fetch(:name))
    +
    +    start_index = record.fetch(:start_line) - 1
    +    start_index -= 1 while start_index.positive? && gemfile_comment_line?(lines[start_index - 1])
    +    (start_index..(record.fetch(:end_line) - 1)).each { |index| remove_indexes << index }
       end
    -  entries = deduplicate_readme_top_logo_entries(entries)
    -  readme_top_logo_entries_with_asset_size(entries)
    +  return content if remove_indexes.empty?
    +
    +  ensure_trailing_newline(lines.each_with_index.reject { |_line, index| remove_indexes.include?(index) }.map(&:first).join.gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 9175
    +      
    # File 'lib/kettle/jem.rb', line 6615
     
    -def readme_h2_synopsis_logo_options(config)
    -  readme_h2_synopsis_logo_specs(config).map { |spec| spec.fetch(:type) }
    +def remove_gemfile_dependency_lines(content, gem_names)
    +  names = gem_names.map(&:to_s).reject(&:empty?).uniq
    +  return content if names.empty?
    +
    +  remove_indexes = Set.new
    +  gemfile_gem_call_records(content).each do |record|
    +    next unless names.include?(record.fetch(:name))
    +
    +    (record.fetch(:start_line)..record.fetch(:end_line)).each { |line_number| remove_indexes << (line_number - 1) }
    +  end
    +  lines = content.to_s.lines.each_with_index.reject { |_line, index| remove_indexes.include?(index) }.map(&:first)
    +  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 9419
    +      
    # File 'lib/kettle/jem.rb', line 6806
     
    -def readme_h2_synopsis_logo_row(entries)
    -  default_width = readme_default_logo_width(entries, one: "10%", two: "8%")
    -  entries.map do |entry|
    -    readme_logo_html(entry, align: "right", width: entry[:width] || default_width)
    -  end.join(" ")
    +def remove_gemfile_percent_w_entries(content, gem_names)
    +  names = gem_names.map(&:to_s).reject(&:empty?).uniq
    +  return content if names.empty?
    +
    +  replacements = ruby_word_array_records(content).filter_map do |record|
    +    kept = record.fetch(:names).reject { |word| names.include?(word) }
    +    next if kept == record.fetch(:names)
    +
    +    replacement = if record.fetch(:source).lines.one?
    +      "%w[#{kept.join(" ")}]"
    +    else
    +      ruby_multiline_word_array_source(kept, indent: record.fetch(:start_column))
    +    end
    +    {start_offset: record.fetch(:start_offset), end_offset: record.fetch(:end_offset), replacement: replacement}
    +  end
    +  return content if replacements.empty?
    +
    +  replaced = replace_source_offsets(content, replacements)
    +  ensure_trailing_newline(replaced.gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 9179
    -
    -def readme_h2_synopsis_logo_specs(config)
    -  readme_config = readme_config_hash(config)
    -  h2_synopsis_logos = readme_config["h2_synopsis_logos"]
    -  normalized = normalized_readme_logo_specs(h2_synopsis_logos)
    -  return normalized unless normalized.empty?
    -
    -  raw_top_logos = readme_config["top_logos"] || readme_config["top_logo_options"]
    -  normalized_top_logos = normalized_readme_logo_specs(raw_top_logos)
    -  synopsis_from_top_logos = normalized_top_logos.select { |spec| README_H2_SYNOPSIS_LOGO_DEFAULTS.include?(spec.fetch(:type)) }
    -  return synopsis_from_top_logos unless synopsis_from_top_logos.empty?
    +      
    # File 'lib/kettle/jem.rb', line 7584
     
    -  legacy_mode = readme_config["top_logo_mode"].to_s.strip.downcase.tr("-", "_")
    -  legacy_options = README_TOP_LOGO_LEGACY_MODE_MAP[legacy_mode]
    -  synopsis_from_legacy = Array(legacy_options).filter_map do |option|
    -    {type: option, width: nil} if README_H2_SYNOPSIS_LOGO_DEFAULTS.include?(option)
    -  end
    -  return synopsis_from_legacy unless synopsis_from_legacy.empty?
    +def remove_gemspec_assignment(content, receiver:, field:)
    +   = gemspec_assignment_records(content, receiver: receiver)
    +    .select { |record| record.fetch(:field) == field.to_s }
    +    .to_h { |record| [record.fetch(:start_line), record.merge(replacement: "")] }
    +  return content if .empty?
     
    -  raw_top_logos ? [] : README_H2_SYNOPSIS_LOGO_DEFAULTS.map { |option| {type: option, width: nil} }
    +  ensure_trailing_newline(replace_record_ranges(content, ).gsub(/\n{3,}/, "\n\n"))
     end
    +
    @@ -41342,9 +58051,9 @@

    -

    +

    - .readme_integration_project_root(project_root, template_profile, repository) ⇒ Object + .remove_gemspec_development_dependencies_already_runtime(content, receiver:) ⇒ Object @@ -41356,19 +58065,47 @@

     
     
    -9865
    -9866
    -9867
    -9868
    -9869
    +8401 +8402 +8403 +8404 +8405 +8406 +8407 +8408 +8409 +8410 +8411 +8412 +8413 +8414 +8415 +8416 +8417 +8418 +8419

    @@ -41376,9 +58113,9 @@

    -

    +

    - .readme_kloc_from_changelog(project_root, version) ⇒ Object + .remove_gemspec_legacy_version_loader_preamble(content) ⇒ Object @@ -41390,25 +58127,31 @@

     
     
    -4423
    -4424
    -4425
    -4426
    -4427
    -4428
    -4429
    -4430
    +7464 +7465 +7466 +7467 +7468 +7469 +7470 +7471 +7472 +7473 +7474

    @@ -41416,9 +58159,9 @@

    -

    +

    - .readme_license_intro(licenses, author_email: nil) ⇒ Object + .remove_gemspec_self_dependency_lines(content, package_name, receiver:) ⇒ Object @@ -41430,31 +58173,35 @@

     
     
    -9597
    -9598
    -9599
    -9600
    -9601
    -9602
    -9603
    -9604
    -9605
    -9606
    -9607
    +8568 +8569 +8570 +8571 +8572 +8573 +8574 +8575 +8576 +8577 +8578 +8579 +8580

    @@ -41462,9 +58209,9 @@

    -

    +

    - .readme_license_refs(expression, compat_category) ⇒ Object + .remove_gemspec_version_gem_dependency_when_non_default_entrypoint(content, facts, receiver:) ⇒ Object @@ -41476,29 +58223,21 @@

     
     
    -9626
    -9627
    -9628
    -9629
    -9630
    -9631
    -9632
    -9633
    -9634
    -9635
    - -

    + @@ -41506,9 +58245,9 @@

    -

    +

    - .readme_logo_config_value(spec) ⇒ Object + .remove_gemspec_version_gem_dependency_when_runtime_incompatible(content, facts, receiver:) ⇒ Object @@ -41520,17 +58259,21 @@

     
     
    -6752
    -6753
    -6754
    -6755
    +7570 +7571 +7572 +7573 +7574 +7575

    @@ -41538,9 +58281,9 @@

    -

    +

    - .readme_logo_facts(config, package_name:, github_org:, repository: {}) ⇒ Object + .remove_obsolete_simplecov_keep_destination_config(content) ⇒ Object @@ -41552,53 +58295,25 @@

     
     
    -9148
    -9149
    -9150
    -9151
    -9152
    -9153
    -9154
    -9155
    -9156
    -9157
    -9158
    -9159
    -9160
    -9161
    -9162
    -9163
    -9164
    -9165
    -9166
    -9167
    -9168
    -9169
    +8871 +8872 +8873 +8874 +8875 +8876 +8877 +8878

    @@ -41606,9 +58321,9 @@

    -

    +

    - .readme_logo_html(entry, align:, width: nil) ⇒ Object + .remove_readme_badge_and_refs(content, badge_source, link_labels) ⇒ Object @@ -41620,27 +58335,31 @@

     
     
    -9439
    -9440
    -9441
    -9442
    -9443
    -9444
    -9445
    -9446
    -9447
    +5197 +5198 +5199 +5200 +5201 +5202 +5203 +5204 +5205 +5206 +5207

    @@ -41648,9 +58367,9 @@

    -

    +

    - .readme_logo_options_from_config(config, primary_key, secondary_key, defaults) ⇒ Object + .remove_readme_sections(content, section_bases) ⇒ Object @@ -41662,15 +58381,35 @@

     
     
    -9200
    -9201
    -9202
    +5460 +5461 +5462 +5463 +5464 +5465 +5466 +5467 +5468 +5469 +5470 +5471 +5472

    @@ -41678,9 +58417,9 @@

    -

    +

    - .readme_logo_specs_from_config(config, primary_key, secondary_key, defaults) ⇒ Object + .remove_ruby_comment_lines_containing(content, text) ⇒ Object @@ -41692,43 +58431,35 @@

     
     
    -9204
    -9205
    -9206
    -9207
    -9208
    -9209
    -9210
    -9211
    -9212
    -9213
    -9214
    -9215
    -9216
    -9217
    -9218
    -9219
    -9220
    +7604 +7605 +7606 +7607 +7608 +7609 +7610 +7611 +7612 +7613 +7614 +7615 +7616

    @@ -41736,9 +58467,9 @@

    -

    +

    - .readme_logo_template_tokens(readme_logo) ⇒ Object + .remove_stale_generated_gemspec_homepage_replacement(replacements, destination_content, facts, receiver:) ⇒ Object @@ -41750,23 +58481,33 @@

     
     
    -9453
    -9454
    -9455
    -9456
    -9457
    -9458
    -9459
    +7387 +7388 +7389 +7390 +7391 +7392 +7393 +7394 +7395 +7396 +7397 +7398

    @@ -41774,9 +58515,9 @@

    -

    +

    - .readme_metadata_block(facts) ⇒ Object + .remove_stale_main_gemfile_direct_sibling_block(content, template_content) ⇒ Object @@ -41788,53 +58529,39 @@

     
     
    -10882
    -10883
    -10884
    -10885
    -10886
    -10887
    -10888
    -10889
    -10890
    -10891
    -10892
    -10893
    -10894
    -10895
    -10896
    -10897
    -10898
    -10899
    -10900
    -10901
    -10902
    -10903
    +5565 +5566 +5567 +5568 +5569 +5570 +5571 +5572 +5573 +5574 +5575 +5576 +5577 +5578 +5579

    @@ -41842,9 +58569,9 @@

    -

    +

    - .readme_metadata_license_expression(facts) ⇒ Object + .remove_top_level_yaml_key_lines(content, key) ⇒ Object @@ -41856,29 +58583,49 @@

     
     
    -10909
    -10910
    -10911
    -10912
    -10913
    -10914
    -10915
    -10916
    -10917
    -10918
    +13981 +13982 +13983 +13984 +13985 +13986 +13987 +13988 +13989 +13990 +13991 +13992 +13993 +13994 +13995 +13996 +13997 +13998 +13999 +14000

    @@ -41886,9 +58633,9 @@

    -

    +

    - .readme_metadata_table_cell(value) ⇒ Object + .remove_version_gem_entrypoint_references(content) ⇒ Object @@ -41900,15 +58647,41 @@

     
     
    -10905
    -10906
    -10907
    +11535 +11536 +11537 +11538 +11539 +11540 +11541 +11542 +11543 +11544 +11545 +11546 +11547 +11548 +11549 +11550

    @@ -41916,9 +58689,9 @@

    -

    +

    - .readme_preserve_config(config) ⇒ Object + .remove_yaml_mapping_path(content, path) ⇒ Object @@ -41930,39 +58703,31 @@

     
     
    -10156
    -10157
    -10158
    -10159
    -10160
    -10161
    -10162
    -10163
    -10164
    -10165
    -10166
    -10167
    -10168
    -10169
    -10170
    +9047 +9048 +9049 +9050 +9051 +9052 +9053 +9054 +9055 +9056 +9057

    @@ -41970,9 +58735,9 @@

    -

    +

    - .readme_preserve_config_without_partial_sections(preserve_config, partial_sections) ⇒ Object + .remove_yaml_scalar_path(content, path) ⇒ Object @@ -41984,35 +58749,29 @@

    -3543 -3544 -3545 -3546 -3547 -3548 -3549 -3550 -3551 -3552 -3553 -3554 -3555 +9003 +9004 +9005 +9006 +9007 +9008 +9009 +9010 +9011 +9012

    @@ -42020,9 +58779,9 @@

    -

    +

    - .readme_preserve_targets(template_sections, destination_lookup, preserve_config) ⇒ Object + .render_thin_readme(facts, readme_style, original, preserve_config) ⇒ Object @@ -42034,53 +58793,85 @@

     
     
    -10125
    -10126
    -10127
    -10128
    -10129
    -10130
    -10131
    -10132
    -10133
    -10134
    -10135
    -10136
    -10137
    -10138
    -10139
    -10140
    -10141
    -10142
    -10143
    -10144
    -10145
    -10146
    +4066 +4067 +4068 +4069 +4070 +4071 +4072 +4073 +4074 +4075 +4076 +4077 +4078 +4079 +4080 +4081 +4082 +4083 +4084 +4085 +4086 +4087 +4088 +4089 +4090 +4091 +4092 +4093 +4094 +4095 +4096 +4097 +4098 +4099 +4100 +4101 +4102 +4103

    @@ -42088,9 +58879,9 @@

    -

    +

    - .readme_project_emoji(project_root) ⇒ Object + .replace_existing_markdown_managed_block(content, marker, replacement) ⇒ Object @@ -42102,25 +58893,23 @@

     
     
    -7104
    -7105
    -7106
    -7107
    -7108
    -7109
    -7110
    -7111
    +14867 +14868 +14869 +14870 +14871 +14872 +14873

    @@ -42128,52 +58917,45 @@

    -

    - - .readme_section_contains_badge_cloud?(section) ⇒ Boolean +

    - + .replace_gemspec_assignment_sources(content, replacements, receiver:) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • -
    - -

     
     
    -9932
    -9933
    -9934
    -9935
    -9936
    -9937
    -9938
    -9939
    -9940
    -9941
    -9942
    -9943
    -9944
    -9945
    -9946
    -9947
    -9948
    -9949
    -9950
    -9951
    -9952
    +7593 +7594 +7595 +7596 +7597 +7598 +7599 +7600 +7601 +7602
    -
    # File 'lib/kettle/jem.rb', line 9932
    +      
    # File 'lib/kettle/jem.rb', line 7593
     
    -def readme_integration_configured?(project_root, integration)
    -  case integration
    -  when "codecov"
    -    File.exist?(File.join(project_root, ".codecov.yml")) ||
    -      File.exist?(File.join(project_root, "codecov.yml")) ||
    -      github_workflows_include?(project_root, "codecov/codecov-action")
    -  when "coveralls"
    -    File.exist?(File.join(project_root, ".coveralls.yml")) ||
    -      github_workflows_include?(project_root, "coverallsapp/github-action")
    -  when "qlty"
    -    File.exist?(File.join(project_root, ".qlty/qlty.toml")) ||
    -      File.exist?(File.join(project_root, ".qlty.yml")) ||
    -      github_workflows_include?(project_root, "qltysh/qlty-action")
    -  when "codeql"
    -    File.exist?(File.join(project_root, ".github/workflows/codeql.yml")) ||
    -      File.exist?(File.join(project_root, ".github/workflows/codeql-analysis.yml")) ||
    -      github_workflows_include?(project_root, "github/codeql-action")
    -  else
    -    false
    -  end
    +def remove_gemspec_dependency_lines(content, receiver:, names:, runtime_only: false)
    +  wanted = names.map(&:to_s).to_set
    +   = gemspec_dependency_records(content, receiver: receiver)
    +    .select { |record| wanted.include?(record.fetch(:name)) }
    +    .select { |record| !runtime_only || record.fetch(:kind) != "add_development_dependency" }
    +    .to_h { |record| [record.fetch(:start_line), record.merge(replacement: "")] }
    +  return content if .empty?
    +
    +  ensure_trailing_newline(replace_record_ranges(content, ).gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 9865
    +      
    # File 'lib/kettle/jem.rb', line 8401
     
    -def readme_integration_project_root(project_root, template_profile, repository)
    -  return project_root unless repository_monorepo_subproject?(repository)
    +def remove_gemspec_development_dependencies_already_runtime(content, receiver:)
    +  records = gemspec_dependency_records(content, receiver: receiver)
    +  runtime_names = records.each_with_object(Set.new) do |record, names|
    +    next if record.fetch(:kind) == "add_development_dependency"
     
    -  Array(repository && repository[:local_root]).find { |path| !path.to_s.empty? } || project_root
    +    names << record.fetch(:name)
    +  end
    +  return content if runtime_names.empty?
    +
    +  duplicate_development_records = records.select do |record|
    +    record.fetch(:kind) == "add_development_dependency" && runtime_names.include?(record.fetch(:name))
    +  end
    +  return content if duplicate_development_records.empty?
    +
    +   = duplicate_development_records.to_h do |record|
    +    [record.fetch(:start_line), record.merge(replacement: "")]
    +  end
    +  replace_record_ranges(content, )
     end
    -
    # File 'lib/kettle/jem.rb', line 4423
    +      
    # File 'lib/kettle/jem.rb', line 7464
     
    -def readme_kloc_from_changelog(project_root, version)
    -  return if project_root.to_s.empty? || version.to_s.empty?
    +def remove_gemspec_legacy_version_loader_preamble(content)
    +  node = gemspec_top_level_gem_version_node(content)
    +  unless node
    +    fallback_range = gemspec_legacy_version_loader_preamble_line_range(content)
    +    return content unless fallback_range
     
    -  changelog_path = File.join(project_root, "CHANGELOG.md")
    -  return unless File.file?(changelog_path)
    +    return replace_source_range_lines(content, fallback_range.fetch(:start_line), fallback_range.fetch(:end_line), "")
    +  end
     
    -  changelog_coverage_kloc(current_changelog_version_section(File.read(changelog_path), version))
    +  replace_source_range_lines(content, node.location.start_line, expand_line_range_through_following_blanks(content, node.location.end_line), "")
     end
    -
    # File 'lib/kettle/jem.rb', line 9597
    +      
    # File 'lib/kettle/jem.rb', line 8568
     
    -def readme_license_intro(licenses, author_email: nil)
    -  return mit_readme_license_intro if licenses == ["MIT"]
    +def remove_gemspec_self_dependency_lines(content, package_name, receiver:)
    +  name = package_name.to_s
    +  return content if name.empty?
     
    -  intro = "The gem is available under the following license#{"s" if licenses.size > 1}: " \
    -    "#{licenses.map { |license| license_link(license) }.join(", ")}.\n" \
    -    "See [LICENSE.md][#{paperclip_ref(:license)}] for details."
    -  intro += "\n\n#{license_contact_line(author_email, context: :readme)}" if non_mit_licenses?(licenses)
    -  guide_table = license_use_case_guide_table(licenses, author_email: author_email)
    -  intro += "\n\n### License use-case guide\n\n#{guide_table}" if guide_table
    -  intro
    +  remove_indexes = Set.new
    +  gemspec_dependency_records(content, receiver: receiver).each do |record|
    +    next unless record.fetch(:name) == name
    +
    +    (record.fetch(:start_line)..record.fetch(:end_line)).each { |line_number| remove_indexes << (line_number - 1) }
    +  end
    +  lines = content.to_s.lines.each_with_index.reject { |_line, index| remove_indexes.include?(index) }.map(&:first)
    +  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 9626
    -
    -def readme_license_refs(expression, compat_category)
    -  [
    -    "[#{paperclip_ref(:copyright_notice_explainer)}]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year",
    -    "[#{paperclip_ref(:license)}]: LICENSE.md",
    -    "[#{paperclip_ref(:license_ref)}]: #{license_badge_ref(expression)}",
    -    "[#{paperclip_ref(:license_img)}]: #{license_badge_img(expression)}",
    -    "[#{paperclip_ref(:license_compat)}]: #{license_compat_ref(compat_category)}",
    -    "[#{paperclip_ref(:license_compat_img)}]: #{license_compat_img(compat_category)}"
    -  ].join("\n")
    +7577
    +7578
    +7579
    +7580
    +7581
    +7582
    +
    +
    # File 'lib/kettle/jem.rb', line 7577
    +
    +def remove_gemspec_version_gem_dependency_when_non_default_entrypoint(content, facts, receiver:)
    +  return content unless facts.to_h.dig(:version_gem, :non_default_entrypoint)
    +
    +  cleaned = remove_gemspec_dependency_lines(content, receiver: receiver, names: ["version_gem"], runtime_only: true)
    +  remove_ruby_comment_lines_containing(cleaned, "version_gem")
     end
    -
    # File 'lib/kettle/jem.rb', line 6752
    +      
    # File 'lib/kettle/jem.rb', line 7570
     
    -def readme_logo_config_value(spec)
    -  width = spec[:width].to_s
    -  width.empty? ? spec.fetch(:type).tr("_", "-") : "#{spec.fetch(:type).tr("_", "-")}|#{width}"
    +def remove_gemspec_version_gem_dependency_when_runtime_incompatible(content, facts, receiver:)
    +  return content if version_gem_runtime_compatible?(facts)
    +
    +  cleaned = remove_gemspec_dependency_lines(content, receiver: receiver, names: ["version_gem"], runtime_only: true)
    +  remove_ruby_comment_lines_containing(cleaned, "version_gem")
     end
    -
    # File 'lib/kettle/jem.rb', line 9148
    +      
    # File 'lib/kettle/jem.rb', line 8871
     
    -def readme_logo_facts(config, package_name:, github_org:, repository: {})
    -  top_entries = readme_top_logo_entries(
    -    config,
    -    org: github_org.to_s,
    -    gem_name: package_name.to_s,
    -    repository: repository || {}
    -  )
    -  h2_synopsis_entries = readme_h2_synopsis_logo_entries(
    -    config,
    -    org: github_org.to_s,
    -    gem_name: package_name.to_s,
    -    repository: repository || {}
    -  )
    -  all_entries = deduplicate_readme_top_logo_entries(top_entries + h2_synopsis_entries)
    -  compact_hash(
    -    top_logos: readme_top_logo_options(config).join(","),
    -    h2_synopsis_logos: readme_h2_synopsis_logo_options(config).join(","),
    -    top_logo_row: readme_top_logo_row(top_entries),
    -    h2_synopsis_logo_row: readme_h2_synopsis_logo_row(h2_synopsis_entries),
    -    top_logo_refs: readme_top_logo_refs(all_entries)
    -  )
    +def remove_obsolete_simplecov_keep_destination_config(content)
    +  config = YAML.safe_load(content.to_s, permitted_classes: [], aliases: true) || {}
    +  simplecov_config = config.dig("files", ".simplecov")
    +  return content unless simplecov_config.is_a?(Hash)
    +  return content unless simplecov_config.keys == ["strategy"] && simplecov_config["strategy"].to_s == "keep_destination"
    +
    +  remove_yaml_mapping_path(content, %w[files .simplecov])
     end
    -
    # File 'lib/kettle/jem.rb', line 9439
    +      
    # File 'lib/kettle/jem.rb', line 5197
     
    -def readme_logo_html(entry, align:, width: nil)
    -  attributes = [
    -    %(alt="#{html_attribute_escape("#{entry[:label]} Logo#{entry[:credit_separator]}#{entry[:credit]}")}"),
    -    %(src="#{html_attribute_escape(entry[:image_url])}")
    -  ]
    -  attributes << %(width="#{html_attribute_escape(width)}") if width
    -  attributes << %(align="#{html_attribute_escape(align)}")
    -  %(<a href="#{html_attribute_escape(entry[:href])}"><img #{attributes.join(" ")}/></a>)
    +def remove_readme_badge_and_refs(content, badge_source, link_labels)
    +  ensure_runtime_dependencies!
    +  processed = content.to_s.gsub(badge_source, "").lines.map(&:rstrip).join("\n")
    +  processed = "#{processed}\n" if content.to_s.end_with?("\n")
    +  Array(link_labels).reduce(processed) do |memo, label|
    +    delete_markdown_with_ast_crispr(
    +      memo,
    +      Ast::Crispr::Markdown::Markly::Selectors.link_definition(label: label, limit: {at_least: 0})
    +    )
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 9200
    +      
    # File 'lib/kettle/jem.rb', line 5460
     
    -def readme_logo_options_from_config(config, primary_key, secondary_key, defaults)
    -  readme_logo_specs_from_config(config, primary_key, secondary_key, defaults).map { |spec| spec.fetch(:type) }
    +def remove_readme_sections(content, section_bases)
    +  bases = section_bases.map { |section| normalize_readme_heading(section) }.uniq
    +  return content if bases.empty?
    +
    +  sections = markdown_sections(content).select { |section| bases.include?(section.fetch(:base)) }
    +  return content if sections.empty?
    +
    +  lines = content.to_s.split("\n", -1)
    +  sections.reverse_each do |section|
    +    lines[section.fetch(:start)..section.fetch(:end)] = []
    +  end
    +  ensure_trailing_newline(lines.join("\n").gsub(/\n{3,}/, "\n\n").strip)
     end
    -
    # File 'lib/kettle/jem.rb', line 9204
    +      
    # File 'lib/kettle/jem.rb', line 7604
     
    -def readme_logo_specs_from_config(config, primary_key, secondary_key, defaults)
    -  readme_config = readme_config_hash(config)
    -  raw_logos = readme_config[primary_key] || readme_config[secondary_key]
    -  normalized = normalized_readme_logo_specs(raw_logos)
    -  selected = normalized.select { |spec| defaults.include?(spec.fetch(:type)) }
    -  return selected unless selected.empty?
    -  return [] if raw_logos
    +def remove_ruby_comment_lines_containing(content, text)
    +  result = prism_parse_success(content)
    +  return content unless result
     
    -  legacy_mode = readme_config["top_logo_mode"].to_s.strip.downcase.tr("-", "_")
    -  legacy_options = README_TOP_LOGO_LEGACY_MODE_MAP[legacy_mode]
    -  selected_legacy = Array(legacy_options).filter_map do |option|
    -    {type: option, width: nil} if defaults.include?(option)
    +  selectors = result.comments.filter_map do |comment|
    +    next unless comment.location.slice.include?(text.to_s)
    +
    +    {start_line: comment.location.start_line, end_line: comment.location.end_line}
       end
    -  return selected_legacy unless selected_legacy.empty?
    +  return content if selectors.empty?
     
    -  defaults.map { |option| {type: option, width: nil} }
    +  ensure_trailing_newline(delete_line_ranges(content.to_s, selectors))
     end
    -
    # File 'lib/kettle/jem.rb', line 9453
    +      
    # File 'lib/kettle/jem.rb', line 7387
     
    -def readme_logo_template_tokens()
    -  {
    -    "KJ|README:H2_SYNOPSIS_LOGO_ROW" => [:h2_synopsis_logo_row].to_s,
    -    "KJ|README:TOP_LOGO_ROW" => [:top_logo_row].to_s,
    -    "KJ|README:TOP_LOGO_REFS" => [:top_logo_refs].to_s
    -  }
    +def remove_stale_generated_gemspec_homepage_replacement(replacements, destination_content, facts, receiver:)
    +  desired_homepage = facts.to_h.dig(:package, :homepage_url).to_s
    +  return replacements if desired_homepage.empty? || !github_org_from_url(desired_homepage)
    +  return replacements unless replacements.key?("homepage")
    +
    +  existing = gemspec_assignment_records(destination_content, receiver: receiver).find { |record| record.fetch(:field) == "homepage" }
    +  existing_homepage = existing && existing.fetch(:value).to_s
    +  return replacements if existing_homepage.empty? || existing_homepage == desired_homepage
    +  return replacements unless github_org_from_url(existing_homepage)
    +
    +  replacements.except("homepage")
     end
    -
    # File 'lib/kettle/jem.rb', line 10882
    +      
    # File 'lib/kettle/jem.rb', line 5565
     
    -def (facts)
    -  package = facts.fetch(:package)
    -  funding_urls = facts.fetch(:funding, {}).fetch(:urls, [])
    -  rows = [
    -    ["Package", package[:name]],
    -    ["Description", package[:description]],
    -    ["Homepage", package[:homepage_url]],
    -    ["Source", package[:source_url]],
    -    ["License", (facts)],
    -    ["Funding", funding_urls.join(", ")]
    -  ].reject { |(_, value)| value.to_s.empty? }
    +def remove_stale_main_gemfile_direct_sibling_block(content, template_content)
    +  return content if template_content.to_s.include?("direct_sibling_gems = %w[")
     
    -  [
    -    "<!-- kettle-jem:metadata:start -->",
    -    "| Field | Value |",
    -    "|---|---|",
    -    *rows.map do |field, value|
    -      "| #{(field)} | #{(value)} |"
    -    end,
    -    "<!-- kettle-jem:metadata:end -->"
    -  ].join("\n")
    +  records = main_gemfile_direct_sibling_records(content)
    +  return content if records.empty?
    +
    +  records.sort_by { |record| -record.fetch(:start_line) }.reduce(content.to_s) do |output, record|
    +    replace_source_range_lines(
    +      output,
    +      record.fetch(:start_line),
    +      expand_line_range_through_following_blanks(output, record.fetch(:end_line)),
    +      ""
    +    )
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 10909
    +      
    # File 'lib/kettle/jem.rb', line 13981
     
    -def (facts)
    -  package = facts.fetch(:package)
    -  expression = package[:license_expression].to_s
    -  spdx_ids = Array(facts.dig(:license, :spdx)).map(&:to_s).reject(&:empty?)
    -  return expression if expression.empty? || spdx_ids.empty?
    +def remove_top_level_yaml_key_lines(content, key)
    +  lines = content.to_s.lines
    +  document = Psych.parse_stream(content.to_s).children.first
    +  root = document&.root
    +  return content unless root.is_a?(Psych::Nodes::Mapping)
     
    -  spdx_ids.sort_by { |spdx_id| -spdx_id.length }.reduce(expression) do |formatted, spdx_id|
    -    formatted.gsub(/\b#{Regexp.escape(spdx_id)}\b/, "`#{spdx_id}`")
    +  pairs = root.children.each_slice(2).to_a
    +  pairs.each_with_index do |(key_node, value_node), index|
    +    next unless key_node.is_a?(Psych::Nodes::Scalar) && key_node.value.to_s == key.to_s
    +
    +    next_key = pairs[index + 1]&.first
    +    end_line = next_key&.start_line || value_node.end_line
    +    end_line += 1 if end_line <= key_node.start_line
    +    return [*lines[0...key_node.start_line], *lines[end_line..].to_a].join
       end
    +
    +  content
    +rescue Psych::Exception
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 10905
    +      
    # File 'lib/kettle/jem.rb', line 11535
     
    -def (value)
    -  value.to_s.split(/\r\n?|\n/).map(&:strip).join("<br>").gsub("|", "\\|")
    +def remove_version_gem_entrypoint_references(content)
    +  selectors = []
    +  top_level_ruby_call_records(content, :require).each do |call|
    +    next unless ruby_string_argument(call) == "version_gem"
    +
    +    selectors << {start_line: call.location.start_line, end_line: ruby_node_source_end_line(call)}
    +  end
    +  top_level_ruby_call_records(content, :class_eval).each do |call|
    +    next unless version_gem_class_eval_call?(call)
    +
    +    selectors << {start_line: call.location.start_line, end_line: ruby_node_source_end_line(call)}
    +  end
    +  return content.to_s if selectors.empty?
    +
    +  collapse_excess_blank_lines(delete_line_ranges(content.to_s, selectors))
     end
    -
    # File 'lib/kettle/jem.rb', line 10156
    +      
    # File 'lib/kettle/jem.rb', line 9047
     
    -def readme_preserve_config(config)
    -  readme = config["readme"]
    -  return {} unless readme.is_a?(Hash)
    +def remove_yaml_mapping_path(content, path)
    +  lines = content.to_s.lines
    +  yaml_mapping_path_entries(content).each do |entry|
    +    next unless entry.fetch(:path) == path
     
    -  result = {}
    -  result[:sections] = Array(readme["preserve_sections"]) if readme.key?("preserve_sections")
    -  result[:patterns] = Array(readme["preserve_patterns"]) if readme.key?("preserve_patterns")
    -  if readme["section_aliases"].is_a?(Hash)
    -    result[:aliases] = README_SECTION_ALIASES.merge(
    -      readme["section_aliases"].transform_keys { |key| normalize_readme_heading(key) }
    -                               .transform_values { |value| normalize_readme_heading(value) }
    -    )
    +    start_line = entry.fetch(:start_line)
    +    end_line = entry.fetch(:end_line)
    +    return ensure_trailing_newline([*lines[0...start_line], *lines[end_line..].to_a].join)
       end
    -  result
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 3543
    +      
    # File 'lib/kettle/jem.rb', line 9003
     
    -def readme_preserve_config_without_partial_sections(preserve_config, partial_sections)
    -  normalized_partials = partial_sections.map { |section| normalize_readme_section_key(section) }
    -  return preserve_config if normalized_partials.empty?
    +def remove_yaml_scalar_path(content, path)
    +  lines = content.to_s.lines
    +  yaml_scalar_path_entries(content).each do |entry|
    +    next unless entry.fetch(:path) == path
     
    -  config = (preserve_config || {}).dup
    -  sections = if config.key?(:sections)
    -    Array(config[:sections]).map { |section| normalize_readme_section_key(section) }
    -  else
    -    README_DEFAULT_PRESERVE_SECTIONS.dup
    +    line_index = entry.fetch(:line)
    +    return ensure_trailing_newline(lines.each_with_index.reject { |_line, index| index == line_index }.map(&:first).join)
       end
    -  config[:sections] = sections.reject { |section| normalized_partials.include?(section) }
    -  config
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 10125
    +      
    # File 'lib/kettle/jem.rb', line 4066
    +
    +def render_thin_readme(facts, readme_style, original, preserve_config)
    +  package = facts.fetch(:package)
    +  rubygems = facts.fetch(:rubygems)
    +  license_expression = package[:license_expression].to_s
    +  min_ruby = minimum_ruby_token(rubygems[:min_ruby])
    +  title = classify_namespace(package.fetch(:name))
    +  badges = [
    +    package[:source_url] && "[![Source](https://img.shields.io/badge/source-github-238636.svg)](#{package[:source_url]})",
    +    license_expression.empty? ? nil : "![License](https://img.shields.io/badge/license-#{shield_token(license_expression)}-259D6C.svg)"
    +  ].compact.join(" ")
    +  funding_enabled = readme_style.fetch(:floss_funding_enabled, false)
    +  security_enabled = readme_style.fetch(:security_enabled, false)
    +  section_partials = readme_section_partials_for_render(readme_style, facts)
    +  rendered = [
    +    "# 💎 #{title}",
    +    badges,
    +    "## 🌻 Synopsis\n\n#{section_partials.fetch("synopsis", "")}",
    +    "## 💡 Info you can shake a stick at\n\nCompatible with MRI Ruby #{min_ruby}+.\n\n#{readme_family_intro_and_backend_matrix(readme_style)}",
    +    "## ✨ Installation\n\n```console\ngem install #{package.fetch(:name)}\n```",
    +    "## ⚙️ Configuration\n\n#{section_partials.fetch("configuration", "")}",
    +    "## 🔧 Basic Usage\n\n#{section_partials.fetch("basic usage", "")}"
    +  ]
    +  rendered << "## 🦷 FLOSS Funding\n\nThis free software project accepts funding support when configured by the package maintainer." if funding_enabled
    +  rendered << "## 🔐 Security\n\nSee [SECURITY.md](SECURITY.md)." if security_enabled
    +  rendered.concat([
    +    "## 🤝 Contributing\n\nContributions are welcome. Missing optional service integrations are reported by the generator instead of rendered as broken badges.",
    +    "## 📌 Versioning\n\nThis project follows semantic versioning for its public API where practical.",
    +    "## 📄 License\n\nThis project is made available under the following license expression: #{license_expression.empty? ? "unspecified" : license_expression}.",
    +    "## 🤑 A request for help\n\nPlease support the project by using it, reporting issues, and contributing improvements."
    +  ])
    +  template_content = rendered.reject(&:empty?).join("\n\n") + "\n"
     
    -def readme_preserve_targets(template_sections, destination_lookup, preserve_config)
    -  sections = if preserve_config.key?(:sections)
    -    Array(preserve_config[:sections]).map { |section| normalize_readme_heading(section) }
    -  else
    -    README_DEFAULT_PRESERVE_SECTIONS.dup
    -  end
    -  patterns = if preserve_config.key?(:patterns)
    -    Array(preserve_config[:patterns]).map { |pattern| pattern.to_s.strip.downcase }
    -  else
    -    README_DEFAULT_PRESERVE_PATTERNS.dup
    -  end
    -  aliases = preserve_config[:aliases] || README_SECTION_ALIASES
    -  targets = sections.dup
    -  template_sections.each do |section|
    -    base = section.fetch(:base)
    -    targets << base if patterns.any? { |pattern| File.fnmatch?(pattern, base, File::FNM_PATHNAME) }
    -  end
    -  aliases.each do |from, to|
    -    targets << to if destination_lookup.key?(from) && targets.include?(to)
    -  end
    -  targets.uniq
    +  merge_readme_template(
    +    template_content: template_content,
    +    destination_content: original,
    +    preserve_config: readme_preserve_config_without_partial_sections(preserve_config, section_partials.keys)
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 7104
    -
    -def readme_project_emoji(project_root)
    -  readme_path = File.join(project_root, "README.md")
    -  return unless File.exist?(readme_path)
    +      
    # File 'lib/kettle/jem.rb', line 14867
     
    -  h1 = markdown_heading_owners(File.read(readme_path), source_label: "README.md").find { |owner| owner.level == 1 }
    -  candidate = first_grapheme(h1&.heading_text)
    -  decorative_grapheme?(candidate) ? candidate : nil
    +def replace_existing_markdown_managed_block(content, marker, replacement)
    +  open = "<!-- #{marker}:start -->"
    +  close = "<!-- #{marker}:end -->"
    +  replace_markdown_managed_block_with_crispr(content, open, close, replacement) do
    +    content
    +  end
     end
    +
    @@ -42181,9 +58963,9 @@

    -

    +

    - .readme_section_partials(project_root, config, readme) ⇒ Object + .replace_gemspec_version_assignment(content, receiver:, rhs:) ⇒ Object @@ -42195,57 +58977,29 @@

     
     
    -9885
    -9886
    -9887
    -9888
    -9889
    -9890
    -9891
    -9892
    -9893
    -9894
    -9895
    -9896
    -9897
    -9898
    -9899
    -9900
    -9901
    -9902
    -9903
    -9904
    -9905
    -9906
    -9907
    -9908
    +7421 +7422 +7423 +7424 +7425 +7426 +7427 +7428 +7429 +7430

    @@ -42253,9 +59007,9 @@

    -

    +

    - .readme_section_partials_for_render(readme_style, facts) ⇒ Object + .replace_github_workflow_action_pin_sha(line, sha) ⇒ Object @@ -42267,33 +59021,15 @@

     
     
    -3530
    -3531
    -3532
    -3533
    -3534
    -3535
    -3536
    -3537
    -3538
    -3539
    -3540
    -3541
    +14751 +14752 +14753

    @@ -42301,169 +59037,60 @@

    -

    +

    - .readme_style_facts(project_root, config, license, template_profile: nil, repository: nil) ⇒ Object + .replace_kettle_config_bootstrap_licenses(content, licenses) ⇒ Object -

     
     
    -10021
    -10022
    -10023
    +8169 +8170 +8171 +8172 +8173 +8174 +8175 +8176 +8177 +8178 +8179
    -
    # File 'lib/kettle/jem.rb', line 10021
    +      
    # File 'lib/kettle/jem.rb', line 8169
     
    -def readme_section_contains_badge_cloud?(section)
    -  section.fetch(:body).to_s.lines.any? { |line| line.include?("[![") }
    +def replace_gemspec_assignment_sources(content, replacements, receiver:)
    +  return content if replacements.empty?
    +
    +   = gemspec_assignment_records(content, receiver: receiver).each_with_object({}) do |record, index|
    +    field = record.fetch(:field)
    +    next unless replacements.key?(field)
    +
    +    index[record.fetch(:start_line)] = record.merge(replacement: "#{replacements.fetch(field)}\n")
    +  end
    +  replace_record_ranges(content, )
     end
    -
    # File 'lib/kettle/jem.rb', line 9885
    -
    -def readme_section_partials(project_root, config, readme)
    -  configured = readme["section_partials"]
    -  return {} unless configured.is_a?(Hash)
    -
    -  root = template_root(project_root, config["templates"].is_a?(Hash) ? config["templates"] : {})
    -  configured.each_with_object({}) do |(section, source), result|
    -    normalized = normalize_readme_section_key(section)
    -    next if normalized.empty?
    +      
    # File 'lib/kettle/jem.rb', line 7421
     
    -    source_path = source.to_s
    -    next if source_path.empty?
    +def replace_gemspec_version_assignment(content, receiver:, rhs:)
    +  replacement = "#{receiver}.version = #{rhs}"
    +  record = gemspec_assignment_records(content, receiver: receiver).find { |candidate| candidate.fetch(:field) == "version" }
    +  return replace_source_range_lines(content, record.fetch(:start_line), record.fetch(:end_line), "#{leading_whitespace(record.fetch(:source))}#{replacement}\n") if record
     
    -    selected = preferred_template_source(root.fetch(:path), source_path)
    -    next unless selected
    +  name = gemspec_assignment_records(content, receiver: receiver).find { |candidate| candidate.fetch(:field) == "name" }
    +  return insert_lines_after(content, name.fetch(:end_line), "  #{replacement}\n") if name
     
    -    result[normalized] = {
    -      configured_source: source_path,
    -      selected_source: template_source_display_path(root, selected),
    -      source_relative_path: selected,
    -      source_root: root.fetch(:kind),
    -      content: File.read(File.join(root.fetch(:path), selected))
    -    }
    -  end
    +  insert_lines_after(content, gemspec_new_call(content)&.location&.start_line || 1, "  #{replacement}\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 3530
    -
    -def readme_section_partials_for_render(readme_style, facts)
    -  partials = readme_style[:section_partials]
    -  return {} unless partials.is_a?(Hash)
    -
    -  tokens = readme_template_tokens(facts)
    -  partials.each_with_object({}) do |(section, partial), result|
    -    content = partial.is_a?(Hash) ? partial[:content].to_s : partial.to_s
    -    next if content.strip.empty?
    +      
    # File 'lib/kettle/jem.rb', line 14751
     
    -    result[normalize_readme_section_key(section)] = resolve_template_tokens(content, tokens)
    -  end
    +def replace_github_workflow_action_pin_sha(line, sha)
    +  line.to_s.sub(/@[a-f0-9]{40}/, "@#{sha}")
     end
    - - - - -
    -
    -
    +
    +
    + -9811 -9812 -9813 -9814 -9815 -9816 -9817 -9818 -9819 -9820 -9821 -9822 -9823 -9824 -9825 -9826 -9827 -9828 -9829 -9830 -9831 -9832 -9833 -9834 -9835 -9836 -9837 -9838 -9839 -9840 -9841
    -
    -
    # File 'lib/kettle/jem.rb', line 9811
     
    -def readme_style_facts(project_root, config, license, template_profile: nil, repository: nil)
    -  readme = config["readme"].is_a?(Hash) ? config["readme"] : {}
    -  conditional = readme["conditional_sections"].is_a?(Hash) ? readme["conditional_sections"] : {}
    -  disabled_integrations = readme_disabled_integrations(readme)
    -  integration_root = readme_integration_project_root(project_root, template_profile, repository)
    -  missing_integrations = README_INTEGRATIONS.reject do |integration|
    -    disabled_integrations.include?(integration) || readme_integration_configured?(integration_root, integration)
    -  end
    -  workflow_paths = readme_workflow_paths(integration_root)
    -  omitted_sections = []
    -  security_enabled = repository_monorepo_subproject?(repository) ||
    -    File.exist?(File.join(project_root, "SECURITY.md"))
    -  floss_funding_enabled = readme_floss_funding_enabled?(license, conditional["floss_funding"])
    -  omitted_sections << "security" unless security_enabled
    -  omitted_sections << "floss_funding" unless floss_funding_enabled
    -  section_partials = readme_section_partials(project_root, config, readme)
    -  package_family = readme["package_family"].to_s.strip.downcase
    -  fossa_project = readme_fossa_project(readme, repository)
    -  compact_hash(
    -    profile: "slice-740-kettle-readme-style-profile",
    -    security_enabled: security_enabled,
    -    floss_funding_enabled: floss_funding_enabled,
    -    package_family: package_family,
    -    fossa_project: fossa_project,
    -    omitted_sections: omitted_sections,
    -    disabled_integrations: disabled_integrations,
    -    missing_integrations: missing_integrations,
    -    workflow_paths: workflow_paths,
    -    section_partials: section_partials
    -  )
    -end
    -
    +
    - -
    -

    +
    - .readme_template_tokens(facts) ⇒ Object +

    Raises:

    +
      - +
    • + + + (Error) + + + +
    • +
    - -

    +
    @@ -42471,29 +59098,58 @@

    -

    +

    - .readme_top_logo_credit_separator(type) ⇒ Object + .replace_kettle_config_bootstrap_project_emoji(content, emoji) ⇒ Object -

     
     
    -3557
    -3558
    -3559
    -3560
    -3561
    -3562
    -3563
    -3564
    -3565
    -3566
    -3567
    -3568
    -3569
    -3570
    -3571
    -3572
    -3573
    -3574
    -3575
    -3576
    -3577
    -3578
    -3579
    -3580
    -3581
    -3582
    -3583
    -3584
    -3585
    -3586
    +8801 +8802 +8803 +8804 +8805 +8806 +8807
    -
    # File 'lib/kettle/jem.rb', line 3557
    +      
    # File 'lib/kettle/jem.rb', line 8801
     
    -def readme_template_tokens(facts)
    -  {
    -    "KJ|CB:USER" => "",
    -    "KJ|FUNDING:BUYMEACOFFEE" => "",
    -    "KJ|FUNDING:KOFI" => "",
    -    "KJ|FUNDING:LIBERAPAY" => "",
    -    "KJ|FUNDING:PATREON" => "",
    -    "KJ|FUNDING:PAYPAL" => "",
    -    "KJ|FUNDING:POLAR" => "",
    -    "KJ|GH:USER" => "",
    -    "KJ|GH_ORG" => github_org_from_url(facts.dig(:package, :source_url)).to_s,
    -    "KJ|GL:USER" => "",
    -    "KJ|PROJECT_EMOJI" => "💎",
    -    "KJ|README:COPYRIGHT_NOTICE" => "",
    -    "KJ|README:LICENSE_BADGE" => "",
    -    "KJ|README:LICENSE_COMPAT_BADGE" => "",
    -    "KJ|README:LICENSE_INTRO" => "",
    -    "KJ|README:LICENSE_REFS" => "",
    -    "KJ|README:H2_SYNOPSIS_LOGO_ROW" => "",
    -    "KJ|README:TOP_LOGO_REFS" => "",
    -    "KJ|README:TOP_LOGO_ROW" => "",
    -    "KJ|SH:USER" => "",
    -    "KJ|SOCIAL:BLUESKY" => "",
    -    "KJ|SOCIAL:DEVTO" => "",
    -    "KJ|SOCIAL:LINKTREE" => "",
    -    "KJ|SOCIAL:MASTODON" => "",
    -    "KJ|HOMEPAGE_URI" => "https://rubydoc.info",
    -    "KJ|YARD_HOST" => "rubydoc.info"
    -  }.merge(template_tokens(facts, facts.fetch(:funding, {})))
    +def replace_kettle_config_bootstrap_licenses(content, licenses)
    +  license_block = ["licenses:", *licenses.map { |license_id| "  - #{license_id}" }].join("\n")
    +  updated = replace_yaml_node_lines(content, "licenses", "#{license_block}\n")
    +  return updated unless updated == content
    +
    +  raise Error, "Could not replace licenses block in .kettle-jem.yml bootstrap template"
     end
    +
    +
    + + + +
    +
    +
    + +

    Raises:

    +
      + +
    • + + + (Error) + + + +
    • + +
    + +
    @@ -42501,9 +59157,9 @@

    -

    +

    - .readme_top_logo_default_alt(type, slug) ⇒ Object + .replace_local_gems_assignment(content, gems) ⇒ Object @@ -42515,38 +59171,28 @@

     
     
    -9347
    -9348
    -9349
    -9350
    -9351
    -9352
    -9353
    -9354
    -9355
    -9356
    -9357
    -9358
    -9359
    -9360
    -9361
    +6177 +6178 +6179 +6180 +6181 +6182 +6183 +6184 +6185 +6186

    @@ -42555,9 +59201,9 @@

    -

    +

    - .readme_top_logo_entries(config, org:, gem_name:, repository: {}) ⇒ Object + .replace_markdown_managed_block(content, marker, replacement) ⇒ Object @@ -42569,29 +59215,23 @@

     
     
    -9256
    -9257
    -9258
    -9259
    -9260
    -9261
    -9262
    -9263
    -9264
    -9265
    +14859 +14860 +14861 +14862 +14863 +14864 +14865

    @@ -42599,9 +59239,9 @@

    -

    +

    - .readme_top_logo_entries_with_asset_size(entries) ⇒ Object + .replace_markdown_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object @@ -42613,21 +59253,47 @@

    -9275 -9276 -9277 -9278 -9279 -9280 +14887 +14888 +14889 +14890 +14891 +14892 +14893 +14894 +14895 +14896 +14897 +14898 +14899 +14900 +14901 +14902 +14903 +14904 +14905

    @@ -42635,9 +59301,9 @@

    -

    +

    - .readme_top_logo_entry_from_config(logo, org:, gem_name:, repository: {}) ⇒ Object + .replace_markdown_with_ast_crispr(content, target, replacement) ⇒ Object @@ -42649,67 +59315,65 @@

     
     
    -9302
    -9303
    -9304
    -9305
    -9306
    -9307
    -9308
    -9309
    -9310
    -9311
    -9312
    -9313
    -9314
    -9315
    -9316
    -9317
    -9318
    -9319
    -9320
    -9321
    -9322
    -9323
    -9324
    -9325
    -9326
    -9327
    -9328
    -9329
    -9330
    +5332 +5333 +5334 +5335 +5336 +5337 +5338 +5339 +5340 + +

    - +
     
     
    -9387
    -9388
    -9389
    +8794 +8795 +8796 +8797 +8798 +8799
    -
    # File 'lib/kettle/jem.rb', line 9387
    +      
    # File 'lib/kettle/jem.rb', line 8794
     
    -def readme_top_logo_credit_separator(type)
    -  (type == "ruby") ? ", " : " by "
    +def replace_kettle_config_bootstrap_project_emoji(content, emoji)
    +  updated = replace_yaml_scalar_line(content, "project_emoji", emoji.to_s)
    +  return updated unless updated == content
    +
    +  raise Error, "Could not replace project_emoji in .kettle-jem.yml bootstrap template"
     end
    -
    # File 'lib/kettle/jem.rb', line 9347
    +      
    # File 'lib/kettle/jem.rb', line 6177
     
    -def readme_top_logo_default_alt(type, slug)
    -  label = slug.split("/").last.to_s
    -  case type
    -  when "related_org"
    -    "Galtzo FLOSS"
    -  when "ruby"
    -    "ruby-lang"
    -  when "org"
    -    label
    -  when "project"
    -    label
    +def replace_local_gems_assignment(content, gems)
    +  replacement = ["local_gems = %w["]
    +  gems.each { |gem_name| replacement << "  #{gem_name}" }
    +  replacement << "]"
    +  if (record = local_gems_assignment_record(content))
    +    replace_source_range_lines(content, record.fetch(:start_line), record.fetch(:end_line), ensure_trailing_newline(replacement.join("\n")))
       else
    -    "#{label} affiliated project"
    +    ensure_trailing_newline([content.to_s.rstrip, replacement.join("\n")].reject(&:empty?).join("\n\n"))
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 9256
    -
    -def readme_top_logo_entries(config, org:, gem_name:, repository: {})
    -  configured = configured_readme_top_logo_entries(config, org: org, gem_name: gem_name, repository: repository)
    -  return readme_top_logo_entries_with_asset_size(configured) if configured
    +      
    # File 'lib/kettle/jem.rb', line 14859
     
    -  entries = readme_logo_specs_from_config(config, "top_logos", "top_logo_options", README_TOP_LOGO_DEFAULTS).filter_map do |spec|
    -    readme_top_logo_entry_from_option(spec.fetch(:type), org: org, gem_name: gem_name, repository: repository)&.merge(width: spec[:width])
    +def replace_markdown_managed_block(content, marker, replacement)
    +  open = "<!-- #{marker}:start -->"
    +  close = "<!-- #{marker}:end -->"
    +  replace_markdown_managed_block_with_crispr(content, open, close, replacement) do
    +    ensure_trailing_newline([content.rstrip, "", replacement.to_s.rstrip].join("\n"))
       end
    -  entries = deduplicate_readme_top_logo_entries(entries)
    -  readme_top_logo_entries_with_asset_size(entries)
     end
    -
    # File 'lib/kettle/jem.rb', line 9275
    +      
    # File 'lib/kettle/jem.rb', line 14887
     
    -def readme_top_logo_entries_with_asset_size(entries)
    -  entries.map do |entry|
    -    image_url = entry.fetch(:image_url).to_s.sub(%r{/avatar-\d+px\.svg\z}, "/avatar-128px.svg")
    -    entry.merge(image_url: image_url)
    -  end
    +def replace_markdown_managed_block_with_crispr(content, open_marker, close_marker, replacement)
    +  ensure_runtime_dependencies!
    +  prepared_replacement = ensure_trailing_newline(replacement.to_s)
    +  actor = Ast::Crispr::Replace.call(
    +    content: content.to_s,
    +    target: Ast::Crispr::Markdown::Markly::Selectors.html_comment_block(
    +      start_text: open_marker.delete_prefix("<!-- ").delete_suffix(" -->"),
    +      end_text: close_marker.delete_prefix("<!-- ").delete_suffix(" -->"),
    +      span: :outermost,
    +      include_trailing_gap: true,
    +      limit: {none_or_one: true}
    +    ),
    +    replacement: prepared_replacement,
    +    source_label: "managed markdown block"
    +  )
    +  return actor.updated_content if actor.match_count.positive?
    +
    +  yield
     end
    +
    # File 'lib/kettle/jem.rb', line 5332
    +
    +def replace_markdown_with_ast_crispr(content, target, replacement)
    +  ensure_runtime_dependencies!
    +  Ast::Crispr::Replace.call(
    +    content: content.to_s,
    +    target: target,
    +    replacement: replacement,
    +    source_label: "README.md"
    +  ).updated_content
    +end
    -
    # File 'lib/kettle/jem.rb', line 9302
    +  
    +
    + +
    +

    + + .replace_matching_gemspec_dependency_lines(content, destination_dependencies, receiver:) ⇒ Object + -def readme_top_logo_entry_from_config(, org:, gem_name:, repository: {}) - return unless .is_a?(Hash) + - type = ["type"].to_s.strip.downcase.tr("-", "_") - return unless README_TOP_LOGO_TYPES.include?(type) - type = "ruby" if type == "language" + +

    + + + @@ -42717,9 +59381,9 @@

    -

    +

    - .readme_top_logo_entry_from_option(option, org:, gem_name:, repository: {}) ⇒ Object + .replace_record_ranges(content, records_by_line) ⇒ Object @@ -42731,21 +59395,43 @@

     
     
    -9405
    -9406
    -9407
    -9408
    -9409
    -9410
    +8680 +8681 +8682 +8683 +8684 +8685 +8686 +8687 +8688 +8689 +8690 +8691 +8692 +8693 +8694 +8695 +8696

    @@ -42753,9 +59439,9 @@

    -

    +

    - .readme_top_logo_options(config) ⇒ Object + .replace_ruby_managed_block(content, replacement) ⇒ Object @@ -42767,15 +59453,19 @@

     
     
    -9171
    -9172
    -9173
    +14881 +14882 +14883 +14884 +14885

    @@ -42783,9 +59473,9 @@

    -

    +

    - .readme_top_logo_refs(entries) ⇒ Object + .replace_ruby_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object @@ -42797,15 +59487,47 @@

     
     
    -9435
    -9436
    -9437
    +14926 +14927 +14928 +14929 +14930 +14931 +14932 +14933 +14934 +14935 +14936 +14937 +14938 +14939 +14940 +14941 +14942 +14943 +14944

    @@ -42813,9 +59535,9 @@

    -

    +

    - .readme_top_logo_row(entries) ⇒ Object + .replace_source_byte_range(content, start_offset, end_offset, replacement) ⇒ Object @@ -42827,21 +59549,21 @@

     
     
    -9412
    -9413
    -9414
    -9415
    -9416
    -9417
    +6879 +6880 +6881 +6882 +6883 +6884

    @@ -42849,9 +59571,9 @@

    -

    +

    - .readme_url_template_tokens(repository, package_name, github_org) ⇒ Object + .replace_source_offsets(content, replacements) ⇒ Object @@ -42863,171 +59585,33 @@

     
     
    -8019
    -8020
    -8021
    -8022
    -8023
    -8024
    -8025
    -8026
    -8027
    -8028
    -8029
    -8030
    -8031
    -8032
    -8033
    -8034
    -8035
    -8036
    -8037
    -8038
    -8039
    -8040
    -8041
    -8042
    -8043
    -8044
    -8045
    -8046
    -8047
    -8048
    -8049
    -8050
    -8051
    -8052
    -8053
    -8054
    -8055
    -8056
    -8057
    -8058
    -8059
    -8060
    -8061
    -8062
    -8063
    -8064
    -8065
    -8066
    -8067
    -8068
    -8069
    -8070
    -8071
    -8072
    -8073
    -8074
    -8075
    -8076
    -8077
    -8078
    -8079
    -8080
    -8081
    -8082
    -8083
    -8084
    -8085
    -8086
    -8087
    -8088
    -8089
    -8090
    -8091
    -8092
    -8093
    -8094
    -8095
    -8096
    -8097
    -8098
    -8099
    +6866 +6867 +6868 +6869 +6870 +6871 +6872 +6873 +6874 +6875 +6876 +6877

    @@ -43035,9 +59619,9 @@

    -

    +

    - .readme_workflow_path_from_url(url) ⇒ Object + .replace_source_range_lines(content, start_line, end_line, replacement) ⇒ Object @@ -43049,31 +59633,15 @@

     
     
    -4731
    -4732
    -4733
    -4734
    -4735
    -4736
    -4737
    -4738
    -4739
    -4740
    -4741
    +8698 +8699 +8700

    @@ -43081,9 +59649,9 @@

    -

    +

    - .readme_workflow_paths(project_root) ⇒ Object + .replace_text_managed_block(content, replacement) ⇒ Object @@ -43095,19 +59663,19 @@

     
     
    -9879
    -9880
    -9881
    -9882
    -9883
    +14875 +14876 +14877 +14878 +14879

    @@ -43115,9 +59683,9 @@

    -

    +

    - .recipe_decision_category(recipe) ⇒ Object + .replace_text_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object @@ -43129,25 +59697,45 @@

     
     
    -7255
    -7256
    -7257
    -7258
    -7259
    -7260
    -7261
    -7262
    +14907 +14908 +14909 +14910 +14911 +14912 +14913 +14914 +14915 +14916 +14917 +14918 +14919 +14920 +14921 +14922 +14923 +14924

    @@ -43155,9 +59743,9 @@

    -

    +

    - .recipe_decision_diagnostics(recipe) ⇒ Object + .replace_toml_string_scalar_line(content, key, value) ⇒ Object @@ -43169,29 +59757,31 @@

     
     
    -7273
    -7274
    -7275
    -7276
    -7277
    -7278
    -7279
    -7280
    -7281
    -7282
    +5036 +5037 +5038 +5039 +5040 +5041 +5042 +5043 +5044 +5045 +5046

    @@ -43199,9 +59789,9 @@

    -

    +

    - .recipe_decision_evaluation(decision_policy:, recipe:, changed:, destination_existed:) ⇒ Object + .replace_yaml_node_lines(content, key, replacement) ⇒ Object @@ -43213,29 +59803,35 @@

     
     
    -7244
    -7245
    -7246
    -7247
    -7248
    -7249
    -7250
    -7251
    -7252
    -7253
    +9106 +9107 +9108 +9109 +9110 +9111 +9112 +9113 +9114 +9115 +9116 +9117 +9118

    @@ -43243,9 +59839,9 @@

    -

    +

    - .recipe_default_action(recipe, changed:, destination_existed:) ⇒ Object + .replace_yaml_scalar_line(content, key, value) ⇒ Object @@ -43257,25 +59853,39 @@

     
     
    -7264
    -7265
    -7266
    -7267
    -7268
    -7269
    -7270
    -7271
    +8809 +8810 +8811 +8812 +8813 +8814 +8815 +8816 +8817 +8818 +8819 +8820 +8821 +8822 +8823

    @@ -43283,9 +59893,9 @@

    -

    +

    - .recipe_entry(name, target_path, provider_family, primitive, facts:, provider_backend: nil, selectors: []) ⇒ Object + .replace_yaml_scalar_path(content, path, value) ⇒ Object @@ -43297,31 +59907,41 @@

     
     
    -7306
    -7307
    -7308
    -7309
    -7310
    -7311
    -7312
    -7313
    -7314
    -7315
    -7316
    +8986 +8987 +8988 +8989 +8990 +8991 +8992 +8993 +8994 +8995 +8996 +8997 +8998 +8999 +9000 +9001

    @@ -43329,9 +59949,9 @@

    -

    +

    - .recipe_filter_patterns(template_selection) ⇒ Object + .replacement_for_supported_gemspec_files_assignment(template_record:, destination_record:, template_receiver:) ⇒ Object @@ -43343,19 +59963,27 @@

     
     
    -7228
    -7229
    -7230
    -7231
    -7232
    +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876

    @@ -43363,9 +59991,9 @@

    -

    +

    - .recipe_pack(facts) ⇒ Object + .repository_facts(project_root, source_url, package_name:, repository_topology:) ⇒ Object @@ -43377,313 +60005,77 @@

     
     
    -2829
    -2830
    -2831
    -2832
    -2833
    -2834
    -2835
    -2836
    -2837
    -2838
    -2839
    -2840
    -2841
    -2842
    -2843
    -2844
    -2845
    -2846
    -2847
    -2848
    -2849
    -2850
    -2851
    -2852
    -2853
    -2854
    -2855
    -2856
    -2857
    -2858
    -2859
    -2860
    -2861
    -2862
    -2863
    -2864
    -2865
    -2866
    -2867
    -2868
    -2869
    -2870
    -2871
    -2872
    -2873
    -2874
    -2875
    -2876
    -2877
    -2878
    -2879
    -2880
    -2881
    -2882
    -2883
    -2884
    -2885
    -2886
    -2887
    -2888
    -2889
    -2890
    -2891
    -2892
    -2893
    -2894
    -2895
    -2896
    -2897
    -2898
    -2899
    -2900
    -2901
    -2902
    -2903
    -2904
    -2905
    -2906
    -2907
    -2908
    -2909
    -2910
    -2911
    -2912
    -2913
    -2914
    -2915
    -2916
    -2917
    -2918
    -2919
    -2920
    -2921
    -2922
    -2923
    -2924
    -2925
    -2926
    -2927
    -2928
    -2929
    -2930
    -2931
    -2932
    -2933
    -2934
    -2935
    -2936
    -2937
    -2938
    -2939
    -2940
    -2941
    -2942
    -2943
    -2944
    -2945
    -2946
    -2947
    -2948
    -2949
    -2950
    -2951
    -2952
    -2953
    -2954
    -2955
    -2956
    -2957
    -2958
    -2959
    -2960
    -2961
    -2962
    -2963
    -2964
    -2965
    -2966
    -2967
    -2968
    -2969
    -2970
    -2971
    -2972
    -2973
    -2974
    -2975
    -2976
    -2977
    -2978
    -2979
    -2980
    +11766 +11767 +11768 +11769 +11770 +11771 +11772 +11773 +11774 +11775 +11776 +11777 +11778 +11779 +11780 +11781 +11782 +11783 +11784 +11785 +11786 +11787 +11788 +11789 +11790 +11791 +11792 +11793 +11794 +11795 +11796 +11797 +11798 +11799

    @@ -43691,41 +60083,60 @@

    -

    +

    - .recipe_report_metadata(recipe) ⇒ Object + .repository_monorepo_subproject?(repository) ⇒ Boolean -

    +
     
    -  slug = ["slug"].to_s.strip
    -  slug = default_readme_top_logo_slug(type, org: org, gem_name: gem_name, repository: repository) if slug.empty?
    -  return if slug.empty?
     
    -  alt = ["alt"].to_s.strip
    -  alt = readme_top_logo_default_alt(type, slug) if alt.empty?
    -  href = ["href"].to_s.strip
    -  href = default_readme_top_logo_href(type, slug: slug, org: org, gem_name: gem_name, repository: repository) if href.empty?
    -  credit = ["credit"].to_s.strip
    -  credit = default_readme_top_logo_credit(type) if credit.empty?
    -  ref_slug = slug.tr("/", "-")
    -  {
    -    type: type,
    -    label: alt.sub(/\s+logo\z/i, ""),
    -    credit: credit,
    -    credit_separator: readme_top_logo_credit_separator(type),
    -    image_ref: "#{ref_slug}-i",
    -    link_ref: ref_slug,
    -    image_url: "#{LOGOS_GALTZO_BASE_URL}/#{slug}/avatar-192px.svg",
    -    href: href
    -  }
    +8267
    +8268
    +8269
    +8270
    +8271
    +8272
    +8273
    +
    +
    # File 'lib/kettle/jem.rb', line 8267
    +
    +def replace_matching_gemspec_dependency_lines(content, destination_dependencies, receiver:)
    +   = gemspec_dependency_records(content, receiver: receiver).each_with_object({}) do |record, index|
    +    replacement = destination_dependencies[gemspec_dependency_record_key(record)]
    +    index[record.fetch(:start_line)] = record.merge(replacement: replacement) if replacement
    +  end
    +  replace_record_ranges(content, )
     end
    -
    # File 'lib/kettle/jem.rb', line 9405
    +      
    # File 'lib/kettle/jem.rb', line 8680
     
    -def readme_top_logo_entry_from_option(option, org:, gem_name:, repository: {})
    -  return if option == "org" && org.to_s.empty?
    -  return if option == "project" && (org.to_s.empty? || gem_name.to_s.empty?)
    +def replace_record_ranges(content, )
    +  return content if .empty?
     
    -  readme_top_logo_entry_from_config({"type" => option}, org: org, gem_name: gem_name, repository: repository)
    +  skip_until = 0
    +  content.to_s.lines.each_with_index.flat_map do |line, index|
    +    line_number = index + 1
    +    next [] if line_number < skip_until
    +
    +    record = [line_number]
    +    if record
    +      skip_until = record.fetch(:end_line) + 1
    +      record.fetch(:replacement)
    +    else
    +      line
    +    end
    +  end.join
     end
    -
    # File 'lib/kettle/jem.rb', line 9171
    +      
    # File 'lib/kettle/jem.rb', line 14881
     
    -def readme_top_logo_options(config)
    -  readme_logo_options_from_config(config, "top_logos", "top_logo_options", README_TOP_LOGO_DEFAULTS)
    +def replace_ruby_managed_block(content, replacement)
    +  replace_ruby_managed_block_with_crispr(content, MANAGED_BLOCK_OPEN, MANAGED_BLOCK_CLOSE, replacement) do
    +    ensure_trailing_newline([content.rstrip, replacement.to_s.rstrip].reject(&:empty?).join("\n"))
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 9435
    +      
    # File 'lib/kettle/jem.rb', line 14926
     
    -def readme_top_logo_refs(entries)
    -  ""
    +def replace_ruby_managed_block_with_crispr(content, open_marker, close_marker, replacement)
    +  ensure_runtime_dependencies!
    +  prepared_replacement = ensure_trailing_newline(replacement.to_s)
    +  actor = Ast::Crispr::Replace.call(
    +    content: content.to_s,
    +    target: Ast::Crispr::Ruby::Prism::Selectors.comment_line_block(
    +      start_text: open_marker,
    +      end_text: close_marker,
    +      span: :outermost,
    +      include_trailing_gap: true,
    +      limit: {none_or_one: true}
    +    ),
    +    replacement: prepared_replacement,
    +    source_label: "managed Ruby block"
    +  )
    +  return actor.updated_content if actor.match_count.positive?
    +
    +  yield
     end
    -
    # File 'lib/kettle/jem.rb', line 9412
    +      
    # File 'lib/kettle/jem.rb', line 6879
     
    -def readme_top_logo_row(entries)
    -  default_width = readme_default_logo_width(entries, one: "14%", two: "12%")
    -  entries.map do |entry|
    -    readme_logo_html(entry, align: "right", width: entry[:width] || default_width)
    -  end.join(" ")
    +def replace_source_byte_range(content, start_offset, end_offset, replacement)
    +  source = content.to_s
    +  before = source.byteslice(0, start_offset) || +""
    +  after = source.byteslice(end_offset, source.bytesize - end_offset) || +""
    +  "#{before}#{replacement}#{after}"
     end
    -
    # File 'lib/kettle/jem.rb', line 8019
    -
    -def readme_url_template_tokens(repository, package_name, github_org)
    -  repo_url = repository[:url].to_s
    -  repo_name = repository[:name].to_s
    -  repo_slug = repository[:slug].to_s
    -  package_path = repository[:package_path].to_s
    -  package_source_url = repository[:package_source_url].to_s
    -  repo_url = "https://github.com/#{github_org}/#{package_name}" if repo_url.empty?
    -  repo_name = package_name if repo_name.empty?
    -  repo_slug = "#{github_org}/#{repo_name}" if repo_slug.empty?
    -  package_source_url = repo_url if package_source_url.empty?
    +      
    # File 'lib/kettle/jem.rb', line 6866
     
    -  repository = repository.merge(
    -    url: repo_url,
    -    name: repo_name,
    -    slug: repo_slug,
    -    package_path: package_path,
    -    package_source_url: package_source_url
    -  )
    -  resources = repository[:resource_urls].is_a?(Hash) ? repository[:resource_urls] : repository_resource_urls(repository)
    -  resource_url = lambda do |key, fallback|
    -    value = resources[key].to_s
    -    value.empty? ? fallback : value
    +def replace_source_offsets(content, replacements)
    +  output = content.to_s.dup
    +  replacements.sort_by { |replacement| -replacement.fetch(:start_offset) }.each do |replacement|
    +    output = replace_source_byte_range(
    +      output,
    +      replacement.fetch(:start_offset),
    +      replacement.fetch(:end_offset),
    +      replacement.fetch(:replacement)
    +    )
       end
    -
    -  gitlab_source = repository[:gitlab_package_source_url].to_s
    -  codeberg_source = repository[:codeberg_package_source_url].to_s
    -  gitlab_source = "https://gitlab.com/#{repo_slug}/" if gitlab_source.empty?
    -  codeberg_source = "https://codeberg.org/#{repo_slug}" if codeberg_source.empty?
    -  checksums_url = repository[:checksums_url].to_s
    -  checksums_url = "https://gitlab.com/#{repo_slug}/-/tree/main/checksums" if checksums_url.empty?
    -
    -  {
    -    "KJ|README:REPO_SLUG" => repo_slug,
    -    "KJ|README:REPO_NAME" => repo_name,
    -    "KJ|README:PACKAGE_PATH" => package_path,
    -    "KJ|README:GH_REPOSITORY_URL" => resource_url.call(:github_repository_url, repo_url),
    -    "KJ|README:GH_PACKAGE_SOURCE_URL" => resource_url.call(:github_package_source_url, package_source_url),
    -    "KJ|README:GH_RELEASES_URL" => resource_url.call(:github_releases_url, "#{repo_url}/releases"),
    -    "KJ|README:GH_TAG_BADGE_REPO" => repo_slug,
    -    "KJ|README:GH_ACTIONS_URL" => resource_url.call(:github_actions_url, "#{repo_url}/actions"),
    -    "KJ|README:GH_DISCUSSIONS_URL" => resource_url.call(:github_discussions_url, "#{repo_url}/discussions"),
    -    "KJ|README:GH_ISSUES_URL" => resource_url.call(:github_issues_url, "#{repo_url}/issues"),
    -    "KJ|README:GH_PULLS_URL" => resource_url.call(:github_pulls_url, "#{repo_url}/pulls"),
    -    "KJ|README:GH_WIKI_URL" => resource_url.call(:github_wiki_url, "#{repo_url}/wiki"),
    -    "KJ|README:GH_CODEQL_URL" => resource_url.call(:github_codeql_url, "#{repo_url}/security/code-scanning"),
    -    "KJ|README:GH_CONTRIBUTORS_URL" => resource_url.call(:github_contributors_url, "#{repo_url}/graphs/contributors"),
    -    "KJ|README:GH_CONTRIBUTING_URL" => resource_url.call(:github_contributing_url, source_blob_url(repo_url, "CONTRIBUTING.md")),
    -    "KJ|README:GH_CHANGELOG_URL" => resource_url.call(:github_changelog_url, source_blob_url(repo_url, "CHANGELOG.md")),
    -    "KJ|README:GH_SECURITY_URL" => resource_url.call(:github_security_url, source_blob_url(repo_url, "SECURITY.md")),
    -    "KJ|README:GH_CODE_OF_CONDUCT_URL" => resource_url.call(:github_code_of_conduct_url, source_blob_url(repo_url, "CODE_OF_CONDUCT.md")),
    -    "KJ|README:GH_RUBOCOP_URL" => resource_url.call(:github_rubocop_url, source_blob_url(repo_url, "RUBOCOP.md")),
    -    "KJ|README:GH_IRP_URL" => resource_url.call(:github_irp_url, source_blob_url(repo_url, "IRP.md")),
    -    "KJ|README:GL_REPOSITORY_URL" => resource_url.call(:gitlab_repository_url, "https://gitlab.com/#{repo_slug}"),
    -    "KJ|README:GL_PACKAGE_SOURCE_URL" => resource_url.call(:gitlab_package_source_url, gitlab_source),
    -    "KJ|README:GL_ISSUES_URL" => resource_url.call(:gitlab_issues_url, gitlab_repo_url(repository, repo_slug, "issues")),
    -    "KJ|README:GL_PULLS_URL" => resource_url.call(:gitlab_pulls_url, gitlab_repo_url(repository, repo_slug, "merge_requests")),
    -    "KJ|README:GL_WIKI_URL" => resource_url.call(:gitlab_wiki_url, gitlab_repo_url(repository, repo_slug, "wikis/home")),
    -    "KJ|README:GL_CONTRIBUTORS_URL" => resource_url.call(:gitlab_contributors_url, gitlab_repo_url(repository, repo_slug, "graphs/main")),
    -    "KJ|README:GL_CONTRIBUTING_URL" => resource_url.call(:gitlab_contributing_url, source_blob_url("https://gitlab.com/#{repo_slug}", "CONTRIBUTING.md")),
    -    "KJ|README:GL_CHANGELOG_URL" => resource_url.call(:gitlab_changelog_url, source_blob_url("https://gitlab.com/#{repo_slug}", "CHANGELOG.md")),
    -    "KJ|README:GL_CODE_OF_CONDUCT_URL" => resource_url.call(:gitlab_code_of_conduct_url, source_blob_url("https://gitlab.com/#{repo_slug}", "CODE_OF_CONDUCT.md")),
    -    "KJ|README:CB_REPOSITORY_URL" => resource_url.call(:codeberg_repository_url, "https://codeberg.org/#{repo_slug}"),
    -    "KJ|README:CB_PACKAGE_SOURCE_URL" => resource_url.call(:codeberg_package_source_url, codeberg_source),
    -    "KJ|README:CB_ISSUES_URL" => resource_url.call(:codeberg_issues_url, codeberg_repo_url(repository, repo_slug, "issues")),
    -    "KJ|README:CB_PULLS_URL" => resource_url.call(:codeberg_pulls_url, codeberg_repo_url(repository, repo_slug, "pulls")),
    -    "KJ|README:CODECOV_URL" => resource_url.call(:codecov_url, "https://codecov.io/gh/#{repo_slug}"),
    -    "KJ|README:CODECOV_BADGE_URL" => resource_url.call(:codecov_badge_url, "https://codecov.io/gh/#{repo_slug}/graph/badge.svg"),
    -    "KJ|README:CODECOV_GRAPH_URL" => resource_url.call(:codecov_graph_url, "https://codecov.io/gh/#{repo_slug}/graph/badge.svg"),
    -    "KJ|README:COVERALLS_URL" => resource_url.call(:coveralls_url, "https://coveralls.io/github/#{repo_slug}?branch=main"),
    -    "KJ|README:COVERALLS_BADGE_URL" => resource_url.call(:coveralls_badge_url, "https://coveralls.io/repos/github/#{repo_slug}/badge.svg?branch=main"),
    -    "KJ|README:QLTY_PROJECT_URL" => resource_url.call(:qlty_project_url, "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}"),
    -    "KJ|README:QLTY_MAINTAINABILITY_URL" => resource_url.call(:qlty_maintainability_url, "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/maintainability.svg"),
    -    "KJ|README:QLTY_COVERAGE_URL" => resource_url.call(:qlty_coverage_url, "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/metrics/code?sort=coverageRating"),
    -    "KJ|README:QLTY_COVERAGE_BADGE_URL" => resource_url.call(:qlty_coverage_badge_url, "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/coverage.svg"),
    -    "KJ|CHANGELOG:GL_COMPARE_URL" => resource_url.call(:gitlab_compare_url, "https://gitlab.com/#{repo_slug}/-/compare"),
    -    "KJ|CHANGELOG:GL_TAGS_URL" => resource_url.call(:gitlab_tags_url, "https://gitlab.com/#{repo_slug}/-/tags"),
    -    "KJ|README:CONTRIBUTORS_IMAGE_REPO" => repo_slug,
    -    "KJ|README:STAR_HISTORY_REPO" => repo_slug,
    -    "KJ|README:SHA_CHECKSUMS_URL" => resource_url.call(:checksums_url, checksums_url)
    -  }
    +  output
     end
    -
    # File 'lib/kettle/jem.rb', line 4731
    -
    -def readme_workflow_path_from_url(url)
    -  marker = "/actions/workflows/"
    -  path = URI.parse(url.to_s).path.to_s
    -  marker_index = path.index(marker)
    -  return "" unless marker_index
    +      
    # File 'lib/kettle/jem.rb', line 8698
     
    -  workflow = path[(marker_index + marker.length)..].to_s.split("/").first.to_s
    -  workflow.empty? ? "" : ".github/workflows/#{workflow}"
    -rescue URI::InvalidURIError
    -  ""
    +def replace_source_range_lines(content, start_line, end_line, replacement)
    +  replace_record_ranges(content, {start_line => {end_line: end_line, replacement: replacement}})
     end
    -
    # File 'lib/kettle/jem.rb', line 9879
    +      
    # File 'lib/kettle/jem.rb', line 14875
     
    -def readme_workflow_paths(project_root)
    -  Dir.glob(File.join(project_root.to_s, ".github/workflows/*.{yml,yaml}")).map do |path|
    -    ".github/workflows/#{File.basename(path)}"
    -  end.sort
    +def replace_text_managed_block(content, replacement)
    +  replace_text_managed_block_with_crispr(content, MANAGED_BLOCK_OPEN, MANAGED_BLOCK_CLOSE, replacement) do
    +    ensure_trailing_newline([content.rstrip, replacement.to_s.rstrip].reject(&:empty?).join("\n"))
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 7255
    +      
    # File 'lib/kettle/jem.rb', line 14907
     
    -def recipe_decision_category(recipe)
    -  return "delete_file" if delete_file_recipe?(recipe)
    -  return "select_template_source" if recipe.fetch(:primitive) == "supplied_template_source_preference"
    -  return "bootstrap_config" if recipe.fetch(:primitive) == "supplied_kettle_config_bootstrap"
    -  return "apply_template_source" if recipe.fetch(:primitive) == "supplied_template_source_application"
    +def replace_text_managed_block_with_crispr(content, open_marker, close_marker, replacement)
    +  ensure_runtime_dependencies!
    +  prepared_replacement = ensure_trailing_newline(replacement.to_s)
    +  actor = Ast::Crispr::Replace.call(
    +    content: content.to_s,
    +    target: Ast::Crispr::Selectors.line_block(
    +      start_line_text: open_marker,
    +      end_line_text: close_marker,
    +      include_trailing_gap: true,
    +      limit: {none_or_one: true}
    +    ),
    +    replacement: prepared_replacement,
    +    source_label: "managed text block"
    +  )
    +  return actor.updated_content if actor.match_count.positive?
     
    -  "merge_valid_document"
    +  yield
     end
    -
    # File 'lib/kettle/jem.rb', line 7273
    +      
    # File 'lib/kettle/jem.rb', line 5036
     
    -def recipe_decision_diagnostics(recipe)
    -  diagnostics = []
    -  if recipe.fetch(:primitive) == "supplied_template_source_application"
    -    diagnostics << "Non-interactive runs apply the configured template source default and report the decision."
    -  end
    -  if delete_file_recipe?(recipe)
    -    diagnostics << "Deletion is allowed only for explicit Kettle/Jem cleanup primitives."
    +def replace_toml_string_scalar_line(content, key, value)
    +  lines = content.to_s.lines
    +  lines.each_with_index do |line, index|
    +    next unless line.strip.start_with?("#{key} ")
    +
    +    indent = line[/\A\s*/]
    +    lines[index] = "#{indent}#{key} = #{JSON.generate(value.to_s)}\n"
    +    return lines.join
       end
    -  diagnostics
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 7244
    +      
    # File 'lib/kettle/jem.rb', line 9106
     
    -def recipe_decision_evaluation(decision_policy:, recipe:, changed:, destination_existed:)
    -  decision_policy.resolve(
    -    id: "recipe:#{recipe.fetch(:name)}",
    -    category: recipe_decision_category(recipe),
    -    file: recipe.fetch(:target_path),
    -    default_action: recipe_default_action(recipe, changed: changed, destination_existed: destination_existed),
    -    severity: :advisory,
    -    diagnostics: recipe_decision_diagnostics(recipe)
    -  ).to_h
    +def replace_yaml_node_lines(content, key, replacement)
    +  lines = content.to_s.lines
    +  yaml_mapping_nodes(content).each do |mapping|
    +    mapping.children.each_slice(2) do |key_node, value_node|
    +      next unless key_node.is_a?(Psych::Nodes::Scalar) && key_node.value.to_s == key.to_s
    +
    +      start_line = key_node.start_line
    +      end_line = value_node.end_line
    +      return [*lines[0...start_line], replacement, *lines[end_line..].to_a].join
    +    end
    +  end
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 7264
    +      
    # File 'lib/kettle/jem.rb', line 8809
     
    -def recipe_default_action(recipe, changed:, destination_existed:)
    -  return "delete" if delete_file_recipe?(recipe)
    -  return "keep" unless changed
    -  return "create" unless destination_existed
    -  return "replace" if recipe.fetch(:primitive) == "supplied_template_source_application"
    +def replace_yaml_scalar_line(content, key, value)
    +  lines = content.to_s.lines
    +  yaml_scalar_pairs(content).each do |key_node, value_node|
    +    next unless key_node.value.to_s == key.to_s
     
    -  "merge"
    +    line_index = key_node.start_line
    +    line = lines[line_index].to_s
    +    key_index = line.index("#{key}:")
    +    next unless key_index
    +
    +    lines[line_index] = "#{line[0...key_index]}#{key}: #{value}\n"
    +    return lines.join
    +  end
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 7306
    +      
    # File 'lib/kettle/jem.rb', line 8986
     
    -def recipe_entry(name, target_path, provider_family, primitive, facts:, provider_backend: nil, selectors: [])
    -  {
    -    name: name,
    -    target_path: target_path,
    -    provider_family: provider_family,
    -    provider_backend: provider_backend,
    -    primitive: primitive,
    -    facts: facts,
    -    selectors: selectors
    -  }
    +def replace_yaml_scalar_path(content, path, value)
    +  lines = content.to_s.lines
    +  yaml_scalar_path_entries(content).each do |entry|
    +    next unless entry.fetch(:path) == path
    +
    +    line_index = entry.fetch(:line)
    +    line = lines[line_index].to_s
    +    key = path.last.to_s
    +    key_index = line.index("#{key}:")
    +    next unless key_index
    +
    +    lines[line_index] = "#{line[0...key_index]}#{key}: #{value}#{yaml_line_comment_suffix(line, key_index)}\n"
    +    return lines.join
    +  end
    +  content
     end
    -
    # File 'lib/kettle/jem.rb', line 7228
    +      
    # File 'lib/kettle/jem.rb', line 7868
     
    -def recipe_filter_patterns(template_selection)
    -  only = Array(template_selection[:only]).compact
    -  include = Array(template_selection[:include]).compact
    -  only.empty? ? [] : (only + include)
    +def replacement_for_supported_gemspec_files_assignment(template_record:, destination_record:, template_receiver:)
    +  if generic_bundler_gemspec_files_assignment?(destination_record)
    +    normalize_gemspec_receiver(
    +      template_record.fetch(:source),
    +      from: template_receiver,
    +      to: template_receiver
    +    )
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 2829
    +      
    # File 'lib/kettle/jem.rb', line 11766
     
    -def recipe_pack(facts)
    -  recipes = if monorepo_template_profile?(facts)
    -    []
    +def repository_facts(project_root, source_url, package_name:, repository_topology:)
    +  topology = normalize_repository_topology(repository_topology)
    +  monorepo_subproject = topology == REPOSITORY_TOPOLOGY_MONOREPO_SUBPROJECT
    +  local_root = monorepo_subproject ? git_worktree_root(project_root) : nil
    +  repo_url = if monorepo_subproject
    +    repository_root_url(git_remote_source_url(local_root || project_root) || source_url)
       else
    -    [
    -      recipe_entry("readme_metadata", "README.md", "markdown", "supplied_readme_metadata_synchronization", facts: %w[package funding readme]),
    -      recipe_entry("changelog_unreleased", "CHANGELOG.md", "markdown", "changelog_unreleased_normalization", facts: %w[package changelog]),
    -      recipe_entry(
    -        "generated_block_sync",
    -        "gemfiles/modular/shunted.gemfile",
    -        "ruby",
    -        "supplied_managed_text_block_replacement",
    -        facts: %w[package generated_blocks],
    -        provider_backend: "ast-crispr-ruby-prism"
    -      ),
    -      recipe_entry(
    -        "github_funding_yml",
    -        ".github/FUNDING.yml",
    -        "yaml",
    -        "supplied_github_funding_yaml_synchronization",
    -        facts: %w[package funding]
    -      )
    -    ]
    -  end
    -  if facts[:kettle_config_bootstrap]
    -    recipes.unshift(kettle_config_bootstrap_recipe(facts.fetch(:kettle_config_bootstrap)))
    -  end
    -  unless monorepo_template_profile?(facts)
    -    facts.dig(:ci, :framework_matrix, :gemfiles).to_a.each do |gemfile|
    -      recipes << recipe_entry(
    -        "github_actions_framework_gemfile_#{workflow_recipe_slug(gemfile.fetch(:path))}",
    -        gemfile.fetch(:path),
    -        "ruby",
    -        "supplied_framework_matrix_gemfile_generation",
    -        facts: %w[ci]
    -      )
    -    end
    -    facts.dig(:ci, :obsolete_workflows).to_a.each do |workflow_path|
    -      recipes << recipe_entry(
    -        "github_actions_obsolete_workflow_cleanup_#{workflow_recipe_slug(workflow_path)}",
    -        workflow_path,
    -        "file",
    -        "supplied_obsolete_file_deletion",
    -        facts: %w[ci]
    -      )
    -    end
    -    facts.dig(:ci, :opt_in_workflow_cleanups).to_a.each do |workflow_path|
    -      recipes << recipe_entry(
    -        "github_actions_opt_in_workflow_cleanup_#{workflow_recipe_slug(workflow_path)}",
    -        workflow_path,
    -        "file",
    -        "supplied_opt_in_workflow_deletion",
    -        facts: %w[ci]
    -      )
    -    end
    -    facts.dig(:ci, :inactive_packaged_workflow_cleanups).to_a.each do |workflow_path|
    -      recipes << recipe_entry(
    -        "github_actions_inactive_packaged_workflow_cleanup_#{workflow_recipe_slug(workflow_path)}",
    -        workflow_path,
    -        "file",
    -        "supplied_inactive_packaged_workflow_deletion",
    -        facts: %w[ci]
    -      )
    -    end
    -    facts.dig(:funding, :open_collective_files).to_a.each do |relative_path|
    -      recipes << recipe_entry(
    -        "opencollective_disabled_file_cleanup_#{workflow_recipe_slug(relative_path)}",
    -        relative_path,
    -        "file",
    -        "supplied_disabled_opencollective_file_deletion",
    -        facts: %w[funding]
    -      )
    -    end
    -    facts.dig(:ci, :custom_workflows).to_a.each do |workflow_path|
    -      recipes << recipe_entry(
    -        "github_actions_workflow_snippets_#{workflow_recipe_slug(workflow_path)}",
    -        workflow_path,
    -        "yaml",
    -        "supplied_github_actions_workflow_snippet_merge",
    -        facts: %w[ci]
    -      )
    -    end
    -  end
    -  if monorepo_template_profile?(facts)
    -    facts.dig(:ci, :inactive_packaged_workflow_cleanups).to_a.each do |workflow_path|
    -      recipes << recipe_entry(
    -        "github_actions_inactive_packaged_workflow_cleanup_#{workflow_recipe_slug(workflow_path)}",
    -        workflow_path,
    -        "file",
    -        "supplied_inactive_packaged_workflow_deletion",
    -        facts: %w[ci]
    -      )
    -    end
    -  end
    -  facts.dig(:templates, :source_preferences).to_a.each do |preference|
    -    apply_template = preference.fetch(:apply, false)
    -    recipe = recipe_entry(
    -      "#{apply_template ? "template_source_application" : "template_source_preference"}_#{workflow_recipe_slug(preference.fetch(:target_path))}",
    -      preference.fetch(:target_path),
    -      "file",
    -      apply_template ? "supplied_template_source_application" : "supplied_template_source_preference",
    -      facts: %w[templates funding]
    -    )
    -    recipe[:template_preference] = preference
    -    recipe[:template_tokens] = facts.dig(:templates, :tokens) if facts.dig(:templates, :tokens)
    -    recipe[:readme_style] = facts[:readme_style] if preference.fetch(:target_path) == "README.md" && facts[:readme_style]
    -    recipes << recipe
    -  end
    -  facts.dig(:templates, :inactive_packaged_template_cleanups).to_a.each do |cleanup|
    -    recipes << recipe_entry(
    -      "template_inactive_packaged_cleanup_#{workflow_recipe_slug(cleanup.fetch(:target_path))}",
    -      cleanup.fetch(:target_path),
    -      "file",
    -      "supplied_inactive_packaged_template_deletion",
    -      facts: %w[templates]
    -    )
    -  end
    -  facts.dig(:templates, :legacy_destination_cleanups).to_a.each do |cleanup|
    -    recipes << recipe_entry(
    -      "template_legacy_destination_cleanup_#{workflow_recipe_slug(cleanup.fetch(:legacy_path))}",
    -      cleanup.fetch(:legacy_path),
    -      "file",
    -      "supplied_legacy_destination_file_deletion",
    -      facts: %w[templates]
    -    )
    -  end
    -  facts.dig(:templates, :obsolete_license_cleanups).to_a.each do |cleanup|
    -    recipes << recipe_entry(
    -      "template_obsolete_license_cleanup_#{workflow_recipe_slug(cleanup.fetch(:license_path))}",
    -      cleanup.fetch(:license_path),
    -      "file",
    -      "supplied_obsolete_license_file_deletion",
    -      facts: %w[templates license]
    -    )
    +    repository_root_url(source_url)
       end
    -  recipes << recipe_entry(
    -    "rakefile_scaffold_cleanup",
    -    "Rakefile",
    -    "generic_ast",
    -    "supplied_source_selector_deletion",
    -    provider_backend: "generic_structural_owners",
    -    facts: %w[rubygems rakefile],
    -    selectors: %w[rakefile_scaffold]
    +  repo_name = repository_name_from_source_url(repo_url)
    +  org = github_org_from_url(repo_url).to_s
    +  slug = [org, repo_name].reject(&:empty?).join("/")
    +  facts = compact_hash(
    +    mode: monorepo_subproject ? "monorepo_subproject" : "standalone",
    +    topology: topology,
    +    url: repo_url,
    +    name: repo_name,
    +    slug: slug
       )
    +  return facts unless monorepo_subproject
     
    -  {
    -    name: "kettle-jem-core",
    -    version: 1,
    -    ecosystem: "rubygems",
    -    recipes: recipes
    -  }
    +  package_path = git_worktree_prefix(project_root)
    +  package_path = package_path[0...-1] while package_path.end_with?("/")
    +  return facts.merge(local_root: local_root) if package_path.empty?
    +
    +  facts.merge(
    +    local_root: local_root,
    +    package_path: package_path,
    +    package_source_url: source_tree_url(repo_url, package_path),
    +    gitlab_package_source_url: source_tree_url("https://gitlab.com/#{slug}", package_path),
    +    codeberg_package_source_url: source_tree_url("https://codeberg.org/#{slug}", package_path),
    +    checksums_url: source_tree_url("https://gitlab.com/#{slug}", "checksums")
    +  )
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -43733,9 +60144,9 @@

    -

    +

    - .recipe_report_phase(recipe_report) ⇒ Object + .repository_name_from_source_url(source_url) ⇒ Object @@ -43747,15 +60158,21 @@

     
     
    -7776
    -7777
    -7778
    +11759 +11760 +11761 +11762 +11763 +11764

    @@ -43763,9 +60180,9 @@

    -

    +

    - .recipe_run_stats(recipe_reports, diagnostics: []) ⇒ Object + .repository_project_logo_href(repository, slug:, org:, gem_name:) ⇒ Object @@ -43777,75 +60194,21 @@

     
     
    -7808
    -7809
    -7810
    -7811
    -7812
    -7813
    -7814
    -7815
    -7816
    -7817
    -7818
    -7819
    -7820
    -7821
    -7822
    -7823
    -7824
    -7825
    -7826
    -7827
    -7828
    -7829
    -7830
    -7831
    -7832
    -7833
    -7834
    -7835
    -7836
    -7837
    -7838
    -7839
    -7840
    +12200 +12201 +12202 +12203 +12204 +12205

    @@ -43853,9 +60216,9 @@

    -

    +

    - .recipe_run_stats_summary(stats) ⇒ Object + .repository_project_logo_slug(repository, org:, gem_name:) ⇒ Object @@ -43867,31 +60230,21 @@

     
     
    -7842
    -7843
    -7844
    -7845
    -7846
    -7847
    -7848
    -7849
    -7850
    -7851
    -7852
    +12193 +12194 +12195 +12196 +12197 +12198

    @@ -43899,9 +60252,9 @@

    -

    +

    - .recipe_runtime_context(recipe, facts, deletion) ⇒ Object + .repository_resource_urls(repository) ⇒ Object @@ -43913,29 +60266,133 @@

     
     
    -7318
    -7319
    -7320
    -7321
    -7322
    -7323
    -7324
    -7325
    -7326
    -7327
    - -

    + @@ -43943,9 +60400,9 @@

    -

    +

    - .recipe_template_content(project_root, recipe) ⇒ Object + .repository_root_url(source_url) ⇒ Object @@ -43957,37 +60414,31 @@

     
     
    -4157
    -4158
    -4159
    -4160
    -4161
    -4162
    -4163
    -4164
    -4165
    -4166
    -4167
    -4168
    -4169
    -4170
    +11864 +11865 +11866 +11867 +11868 +11869 +11870 +11871 +11872 +11873 +11874

    @@ -43995,9 +60446,9 @@

    -

    +

    - .remove_duplicate_gemspec_assignments(content, receiver:, fields:) ⇒ Object + .repository_topology_for(config, env, template_selection) ⇒ Object @@ -44009,55 +60460,25 @@

     
     
    -6181
    -6182
    -6183
    -6184
    -6185
    -6186
    -6187
    -6188
    -6189
    -6190
    -6191
    -6192
    -6193
    -6194
    -6195
    -6196
    -6197
    -6198
    -6199
    -6200
    -6201
    -6202
    -6203
    +9523 +9524 +9525 +9526 +9527 +9528 +9529 +9530

    @@ -44065,9 +60486,9 @@

    -

    +

    - .remove_gemfile_dependency_blocks(content, gem_names) ⇒ Object + .required_ruby_version_rubocop_disable(min_ruby) ⇒ Object @@ -44079,43 +60500,23 @@

     
     
    -5307
    -5308
    -5309
    -5310
    -5311
    -5312
    -5313
    -5314
    -5315
    -5316
    -5317
    -5318
    -5319
    -5320
    -5321
    -5322
    -5323
    +7562 +7563 +7564 +7565 +7566 +7567 +7568

    @@ -44123,49 +60524,68 @@

    -

    +

    - .remove_gemfile_dependency_lines(content, gem_names) ⇒ Object + .resolve_template_tokens(content, tokens, scan_unresolved: true) ⇒ Object -

     
     
    -7151
    -7152
    -7153
    -7154
    -7155
    -7156
    -7157
    -7158
    -7159
    +12732 +12733 +12734 +12735 +12736 +12737 +12738
    -
    # File 'lib/kettle/jem.rb', line 7151
    +      
    # File 'lib/kettle/jem.rb', line 12732
     
    -def (recipe)
    -   = {packaging_recipe: recipe.fetch(:name)}
    -  [:delete_file] = true if delete_file_recipe?(recipe)
    -  [:template_source_preference] = deep_dup(recipe[:template_preference]) if recipe[:template_preference]
    -  [:template_tokens] = deep_dup(recipe[:template_tokens]) if recipe[:template_tokens]
    -  [:readme_style] = deep_dup(recipe[:readme_style]) if recipe[:readme_style]
    -  [:bootstrap_file] = true if recipe.fetch(:primitive) == "supplied_kettle_config_bootstrap"
    -  
    +def repository_monorepo_subproject?(repository)
    +  return false unless repository.is_a?(Hash)
    +
    +  repository[:topology].to_s == REPOSITORY_TOPOLOGY_MONOREPO_SUBPROJECT ||
    +    repository[:mode].to_s == "monorepo_subproject" ||
    +    repository[:mode].to_s == "monorepo_subgem"
     end
    -
    # File 'lib/kettle/jem.rb', line 7776
    +      
    # File 'lib/kettle/jem.rb', line 11759
     
    -def recipe_report_phase(recipe_report)
    -  phase_for_recipe(recipe_report[:recipe_name], recipe_report[:relative_path])
    +def repository_name_from_source_url(source_url)
    +  base = source_url.to_s.split("?", 2).first.to_s.split("#", 2).first.to_s
    +  base = base[0...-1] while base.end_with?("/")
    +  name = base.split("/").last.to_s
    +  name.end_with?(".git") ? name[0...-4] : name
     end
    -
    # File 'lib/kettle/jem.rb', line 7808
    -
    -def recipe_run_stats(recipe_reports, diagnostics: [])
    -  stats = {
    -    recipes: recipe_reports.length,
    -    created: 0,
    -    pre_existing: 0,
    -    identical: 0,
    -    changed: 0,
    -    deleted: 0,
    -    plugin_file_changes: diagnostics.count { |diagnostic| diagnostic[:kind] == "plugin_file_change" }
    -  }
    -
    -  recipe_reports.each do |report|
    -     = report.fetch(:metadata, {})
    -    if [:delete_file]
    -      stats[:deleted] += 1 if report[:changed]
    -      next
    -    end
    +      
    # File 'lib/kettle/jem.rb', line 12200
     
    -    if [:destination_existed]
    -      stats[:pre_existing] += 1
    -      if report[:changed]
    -        stats[:changed] += 1
    -      else
    -        stats[:identical] += 1
    -      end
    -    elsif report[:changed]
    -      stats[:created] += 1
    -    end
    -  end
    +def repository_project_logo_href(repository, slug:, org:, gem_name:)
    +  package_source_url = repository.is_a?(Hash) ? repository[:package_source_url].to_s : ""
    +  return package_source_url unless package_source_url.empty?
     
    -  stats[:summary] = recipe_run_stats_summary(stats)
    -  stats
    +  (org.to_s.empty? || gem_name.to_s.empty?) ? "#{LOGOS_GALTZO_BASE_URL}/#{slug}/" : "https://github.com/#{org}/#{gem_name}"
     end
    -
    # File 'lib/kettle/jem.rb', line 7842
    +      
    # File 'lib/kettle/jem.rb', line 12193
     
    -def recipe_run_stats_summary(stats)
    -  [
    -    "recipes #{stats.fetch(:recipes)}",
    -    "created #{stats.fetch(:created)}",
    -    "pre_existing #{stats.fetch(:pre_existing)}",
    -    "identical #{stats.fetch(:identical)}",
    -    "changed #{stats.fetch(:changed)}",
    -    "deleted #{stats.fetch(:deleted)}",
    -    "plugin_file_changes #{stats.fetch(:plugin_file_changes)}"
    -  ].join(" ")
    +def repository_project_logo_slug(repository, org:, gem_name:)
    +  package_path = repository.is_a?(Hash) ? repository[:package_path].to_s : ""
    +  return [org, repository[:name].to_s, File.basename(package_path)].reject(&:empty?).join("/") if repository.is_a?(Hash) && !package_path.empty?
    +
    +  [org.to_s, gem_name.to_s].reject(&:empty?).join("/")
     end
    -
    # File 'lib/kettle/jem.rb', line 7318
    +11801
    +11802
    +11803
    +11804
    +11805
    +11806
    +11807
    +11808
    +11809
    +11810
    +11811
    +11812
    +11813
    +11814
    +11815
    +11816
    +11817
    +11818
    +11819
    +11820
    +11821
    +11822
    +11823
    +11824
    +11825
    +11826
    +11827
    +11828
    +11829
    +11830
    +11831
    +11832
    +11833
    +11834
    +11835
    +11836
    +11837
    +11838
    +11839
    +11840
    +11841
    +11842
    +11843
    +11844
    +11845
    +11846
    +11847
    +11848
    +11849
    +11850
    +11851
    +11852
    +11853
    +11854
    +11855
    +11856
    +11857
    +11858
    +11859
    +11860
    +11861
    +11862
    +
    +
    # File 'lib/kettle/jem.rb', line 11801
     
    -def recipe_runtime_context(recipe, facts, deletion)
    -  context = deep_dup(facts)
    -  if recipe.fetch(:primitive) == "supplied_source_selector_deletion" && deletion
    -    context[:delete_selectors] = deletion.fetch(:delete_selectors)
    -  end
    -  context[:template_source_preference] = deep_dup(recipe[:template_preference]) if recipe[:template_preference]
    -  context[:template_tokens] = deep_dup(recipe[:template_tokens]) if recipe[:template_tokens]
    -  context[:readme_style] = deep_dup(recipe[:readme_style]) if recipe[:readme_style]
    -  context
    +def repository_resource_urls(repository)
    +  repo_url = repository[:url].to_s
    +  repo_slug = repository[:slug].to_s
    +  github_org = repo_slug.split("/", 2).first.to_s
    +  repo_name = repository[:name].to_s
    +  gitlab_url = repository[:gitlab_url].to_s
    +  gitlab_url = "https://gitlab.com/#{repo_slug}" if gitlab_url.empty?
    +  codeberg_url = repository[:codeberg_url].to_s
    +  codeberg_url = "https://codeberg.org/#{repo_slug}" if codeberg_url.empty?
    +  package_source_url = repository[:package_source_url].to_s
    +  package_source_url = repo_url if package_source_url.empty?
    +  gitlab_package_source_url = repository[:gitlab_package_source_url].to_s
    +  gitlab_package_source_url = gitlab_url if gitlab_package_source_url.empty?
    +  codeberg_package_source_url = repository[:codeberg_package_source_url].to_s
    +  codeberg_package_source_url = codeberg_url if codeberg_package_source_url.empty?
    +  checksums_url = repository[:checksums_url].to_s
    +  checksums_url = source_tree_url(gitlab_url, "checksums") if checksums_url.empty?
    +
    +  {
    +    github_repository_url: repo_url,
    +    github_package_source_url: package_source_url,
    +    github_releases_url: "#{repo_url}/releases",
    +    github_actions_url: "#{repo_url}/actions",
    +    github_discussions_url: "#{repo_url}/discussions",
    +    github_issues_url: "#{repo_url}/issues",
    +    github_pulls_url: "#{repo_url}/pulls",
    +    github_wiki_url: "#{repo_url}/wiki",
    +    github_codeql_url: "#{repo_url}/security/code-scanning",
    +    github_contributors_url: "#{repo_url}/graphs/contributors",
    +    github_contributing_url: source_blob_url(repo_url, "CONTRIBUTING.md"),
    +    github_changelog_url: source_blob_url(repo_url, "CHANGELOG.md"),
    +    github_security_url: source_blob_url(repo_url, "SECURITY.md"),
    +    github_code_of_conduct_url: source_blob_url(repo_url, "CODE_OF_CONDUCT.md"),
    +    github_rubocop_url: source_blob_url(repo_url, "RUBOCOP.md"),
    +    github_irp_url: source_blob_url(repo_url, "IRP.md"),
    +    gitlab_repository_url: gitlab_url,
    +    gitlab_package_source_url: gitlab_package_source_url,
    +    gitlab_issues_url: "#{gitlab_url}/-/issues",
    +    gitlab_pulls_url: "#{gitlab_url}/-/merge_requests",
    +    gitlab_wiki_url: "#{gitlab_url}/-/wikis/home",
    +    gitlab_contributors_url: "#{gitlab_url}/-/graphs/main",
    +    gitlab_contributing_url: source_blob_url(gitlab_url, "CONTRIBUTING.md"),
    +    gitlab_changelog_url: source_blob_url(gitlab_url, "CHANGELOG.md"),
    +    gitlab_code_of_conduct_url: source_blob_url(gitlab_url, "CODE_OF_CONDUCT.md"),
    +    gitlab_compare_url: "#{gitlab_url}/-/compare",
    +    gitlab_tags_url: "#{gitlab_url}/-/tags",
    +    codeberg_repository_url: codeberg_url,
    +    codeberg_package_source_url: codeberg_package_source_url,
    +    codeberg_issues_url: "#{codeberg_url}/issues",
    +    codeberg_pulls_url: "#{codeberg_url}/pulls",
    +    codecov_url: "https://codecov.io/gh/#{repo_slug}",
    +    codecov_badge_url: "https://codecov.io/gh/#{repo_slug}/graph/badge.svg",
    +    codecov_graph_url: "https://codecov.io/gh/#{repo_slug}/graph/badge.svg",
    +    coveralls_url: "https://coveralls.io/github/#{repo_slug}?branch=main",
    +    coveralls_badge_url: "https://coveralls.io/repos/github/#{repo_slug}/badge.svg?branch=main",
    +    qlty_project_url: "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}",
    +    qlty_maintainability_url: "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/maintainability.svg",
    +    qlty_coverage_url: "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/metrics/code?sort=coverageRating",
    +    qlty_coverage_badge_url: "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/coverage.svg",
    +    checksums_url: checksums_url
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 4157
    +      
    # File 'lib/kettle/jem.rb', line 11864
     
    -def recipe_template_content(project_root, recipe)
    -  return "" unless %w[
    -    supplied_kettle_config_bootstrap
    -    supplied_template_source_preference
    -    supplied_template_source_application
    -  ].include?(recipe.fetch(:primitive))
    +def repository_root_url(source_url)
    +  uri = URI.parse(source_url.to_s)
    +  return source_url.to_s unless uri.host == "github.com"
     
    -  preference = recipe.fetch(:template_preference)
    -  path = File.join(
    -    preference.fetch(:source_root_path, project_root),
    -    preference.fetch(:source_relative_path, preference.fetch(:selected_source))
    -  )
    -  File.read(path)
    +  segments = uri.path.to_s.split("/").reject(&:empty?)
    +  return source_url.to_s if segments.length < 2
    +
    +  "#{uri.scheme}://#{uri.host}/#{segments[0]}/#{segments[1].delete_suffix(".git")}"
    +rescue URI::InvalidURIError
    +  source_url.to_s
     end
    -
    # File 'lib/kettle/jem.rb', line 6181
    -
    -def remove_duplicate_gemspec_assignments(content, receiver:, fields:)
    -  wanted = fields.map(&:to_s).to_set
    -  seen = Set.new
    -  duplicate_ranges = []
    -  gemspec_assignment_records(content, receiver: receiver).each do |record|
    -    field = record.fetch(:field).to_s
    -    next unless wanted.include?(field)
    +      
    # File 'lib/kettle/jem.rb', line 9523
     
    -    key = [record.fetch(:receiver).to_s, field, record.fetch(:value)]
    -    if seen.include?(key)
    -      duplicate_ranges << [record.fetch(:start_line), record.fetch(:end_line)]
    -    else
    -      seen << key
    -    end
    -  end
    -  return content if duplicate_ranges.empty?
    +def repository_topology_for(config, env, template_selection)
    +  repository_config = config["repository"].is_a?(Hash) ? config["repository"] : {}
    +  topology = preferred_template_token_value(nil, repository_config["topology"], env, "KJ_REPOSITORY_TOPOLOGY")
    +  normalized = normalize_repository_topology(topology)
    +  return normalized unless normalized.empty?
     
    -  lines = content.to_s.lines
    -  duplicate_ranges.reverse_each do |start_line, end_line|
    -    lines.slice!(start_line - 1, end_line - start_line + 1)
    -  end
    -  ensure_trailing_newline(lines.join)
    +  monorepo_subgem_template_profile_value?(template_selection[:template_profile]) ? REPOSITORY_TOPOLOGY_MONOREPO_SUBPROJECT : REPOSITORY_TOPOLOGY_STANDALONE
     end
    -
    # File 'lib/kettle/jem.rb', line 5307
    -
    -def remove_gemfile_dependency_blocks(content, gem_names)
    -  names = gem_names.map(&:to_s).reject(&:empty?).uniq
    -  return content if names.empty?
    -
    -  lines = content.to_s.lines
    -  remove_indexes = Set.new
    -  gemfile_gem_call_records(content).each do |record|
    -    next unless names.include?(record.fetch(:name))
    +      
    # File 'lib/kettle/jem.rb', line 7562
     
    -    start_index = record.fetch(:start_line) - 1
    -    start_index -= 1 while start_index.positive? && gemfile_comment_line?(lines[start_index - 1])
    -    (start_index..(record.fetch(:end_line) - 1)).each { |index| remove_indexes << index }
    -  end
    -  return content if remove_indexes.empty?
    +def required_ruby_version_rubocop_disable(min_ruby)
    +  return "" unless Gem::Version.new(min_ruby) < Gem::Version.new("2.0")
     
    -  ensure_trailing_newline(lines.each_with_index.reject { |_line, index| remove_indexes.include?(index) }.map(&:first).join.gsub(/\n{3,}/, "\n\n"))
    +  " # rubocop:disable Gemspec/RequiredRubyVersion"
    +rescue ArgumentError
    +  ""
     end
    +
    +
    + + + +
    +
    +
    + +

    Raises:

    +
      + +
    • + + + (ArgumentError) + + + +
    • + +
    + +
    @@ -44173,9 +60593,9 @@

    -

    +

    - .remove_gemfile_percent_w_entries(content, gem_names) ⇒ Object + .resolve_uncommitted_author!(project_root, author_map) ⇒ Object @@ -44187,49 +60607,35 @@

     
     
    -5432
    -5433
    -5434
    -5435
    -5436
    -5437
    -5438
    -5439
    -5440
    -5441
    -5442
    -5443
    -5444
    -5445
    -5446
    -5447
    -5448
    -5449
    -5450
    -5451
    +10770 +10771 +10772 +10773 +10774 +10775 +10776 +10777 +10778 +10779 +10780 +10781 +10782

    @@ -44237,9 +60643,9 @@

    -

    +

    - .remove_gemspec_assignment(content, receiver:, field:) ⇒ Object + .resolved_licenses(config, gemspec_licenses) ⇒ Object @@ -44251,25 +60657,25 @@

     
     
    -6126
    -6127
    -6128
    -6129
    -6130
    -6131
    -6132
    -6133
    +12382 +12383 +12384 +12385 +12386 +12387 +12388 +12389

    @@ -44277,9 +60683,64 @@

    -

    +

    - .remove_gemspec_dependency_lines(content, receiver:, names:, runtime_only: false) ⇒ Object + .retired_gemspec_development_dependency_key?(key) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +

     
     
    -5293
    -5294
    -5295
    -5296
    -5297
    -5298
    -5299
    -5300
    -5301
    -5302
    -5303
    -5304
    -5305
    +12660 +12661 +12662 +12663 +12664 +12665 +12666 +12667 +12668 +12669 +12670
    -
    # File 'lib/kettle/jem.rb', line 5293
    +      
    # File 'lib/kettle/jem.rb', line 12660
     
    -def remove_gemfile_dependency_lines(content, gem_names)
    -  names = gem_names.map(&:to_s).reject(&:empty?).uniq
    -  return content if names.empty?
    +def resolve_template_tokens(content, tokens, scan_unresolved: true)
    +  resolver = Token::Resolver::Resolve.new(on_missing: :keep)
    +  document = Token::Resolver::Document.new(content.to_s, config: TEMPLATE_TOKEN_CONFIG)
    +  resolved = resolver.resolve(document, stringify_template_tokens(tokens))
    +  return resolved unless scan_unresolved
     
    -  remove_indexes = Set.new
    -  gemfile_gem_call_records(content).each do |record|
    -    next unless names.include?(record.fetch(:name))
    +  unresolved = Token::Resolver::Document.new(resolved, config: TEMPLATE_TOKEN_CONFIG).token_keys.grep(/\AKJ\|/).sort
    +  return resolved if unresolved.empty?
     
    -    (record.fetch(:start_line)..record.fetch(:end_line)).each { |line_number| remove_indexes << (line_number - 1) }
    -  end
    -  lines = content.to_s.lines.each_with_index.reject { |_line, index| remove_indexes.include?(index) }.map(&:first)
    -  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
    +  raise ArgumentError, "unresolved kettle-jem template tokens: #{unresolved.map { |token| "{#{token}}" }.join(", ")}"
     end
    -
    # File 'lib/kettle/jem.rb', line 5432
    -
    -def remove_gemfile_percent_w_entries(content, gem_names)
    -  names = gem_names.map(&:to_s).reject(&:empty?).uniq
    -  return content if names.empty?
    +      
    # File 'lib/kettle/jem.rb', line 10770
     
    -  replacements = ruby_word_array_records(content).filter_map do |record|
    -    kept = record.fetch(:names).reject { |word| names.include?(word) }
    -    next if kept == record.fetch(:names)
    +def resolve_uncommitted_author!(project_root, author_map)
    +  uncommitted = author_map.delete(NOT_COMMITTED_EMAIL)
    +  return unless uncommitted && !uncommitted[:years].empty?
     
    -    replacement = if record.fetch(:source).lines.one?
    -      "%w[#{kept.join(" ")}]"
    -    else
    -      ruby_multiline_word_array_source(kept, indent: record.fetch(:start_column))
    -    end
    -    {start_offset: record.fetch(:start_offset), end_offset: record.fetch(:end_offset), replacement: replacement}
    -  end
    -  return content if replacements.empty?
    +  name = git_capture(project_root, "config", "user.name").strip
    +  email = git_capture(project_root, "config", "user.email").strip
    +  return if email.empty?
     
    -  replaced = replace_source_offsets(content, replacements)
    -  ensure_trailing_newline(replaced.gsub(/\n{3,}/, "\n\n"))
    +  author_map[email][:name] ||= name
    +  author_map[email][:years].concat(uncommitted[:years])
    +rescue ArgumentError
    +  nil
     end
    -
    # File 'lib/kettle/jem.rb', line 6126
    +      
    # File 'lib/kettle/jem.rb', line 12382
     
    -def remove_gemspec_assignment(content, receiver:, field:)
    -   = gemspec_assignment_records(content, receiver: receiver)
    -    .select { |record| record.fetch(:field) == field.to_s }
    -    .to_h { |record| [record.fetch(:start_line), record.merge(replacement: "")] }
    -  return content if .empty?
    +def resolved_licenses(config, gemspec_licenses)
    +  config_licenses = config.is_a?(Hash) ? config["licenses"] : nil
    +  licenses = Array(config_licenses).map { |license| license.to_s.strip }.reject(&:empty?)
    +  return licenses unless licenses.empty?
     
    -  ensure_trailing_newline(replace_record_ranges(content, ).gsub(/\n{3,}/, "\n\n"))
    +  licenses = Array(gemspec_licenses).map { |license| license.to_s.strip }.reject(&:empty?)
    +  licenses.empty? ? ["MIT"] : licenses
     end
    + + + + +
    +
    +
    +
    +8591
    +8592
    +8593
    +8594
    +
    +
    # File 'lib/kettle/jem.rb', line 8591
    +
    +def retired_gemspec_development_dependency_key?(key)
    +  key.first == "add_development_dependency" &&
    +    RETIRED_GEMSPEC_DEVELOPMENT_DEPENDENCIES.include?(key.last)
    +end
    +
    +
    + +
    +

    + + .rewrite_gemspec_version_loader(content, facts:) ⇒ Object @@ -44291,29 +60752,49 @@

     
     
    -6135
    -6136
    -6137
    -6138
    -6139
    -6140
    -6141
    -6142
    -6143
    -6144
    +7400 +7401 +7402 +7403 +7404 +7405 +7406 +7407 +7408 +7409 +7410 +7411 +7412 +7413 +7414 +7415 +7416 +7417 +7418 +7419 -
    # File 'lib/kettle/jem.rb', line 6135
    +      
    # File 'lib/kettle/jem.rb', line 7400
     
    -def remove_gemspec_dependency_lines(content, receiver:, names:, runtime_only: false)
    -  wanted = names.map(&:to_s).to_set
    -   = gemspec_dependency_records(content, receiver: receiver)
    -    .select { |record| wanted.include?(record.fetch(:name)) }
    -    .select { |record| !runtime_only || record.fetch(:kind) != "add_development_dependency" }
    -    .to_h { |record| [record.fetch(:start_line), record.merge(replacement: "")] }
    -  return content if .empty?
    +def rewrite_gemspec_version_loader(content, facts:)
    +  return content if shim_template_profile?(facts)
     
    -  ensure_trailing_newline(replace_record_ranges(content, ).gsub(/\n{3,}/, "\n\n"))
    +  min_ruby = gemspec_runtime_floor_token(facts)
    +  return content if min_ruby.to_s.empty?
    +
    +  namespace = facts.to_h.dig(:rubygems, :namespace).to_s
    +  entrypoint_require = facts.to_h.dig(:rubygems, :entrypoint_require).to_s
    +  entrypoint_require = facts.to_h.dig(:package, :name).to_s.tr("-", "/") if entrypoint_require.empty?
    +  return content if namespace.empty? || entrypoint_require.empty?
    +
    +  receiver = gemspec_block_param(content) || "spec"
    +  min_ruby_version = Gem::Version.new(min_ruby)
    +  modern = min_ruby_version >= MODERN_GEMSPEC_VERSION_LOADER_MIN_RUBY
    +  rhs = modern ? gemspec_modern_version_loader_expression(entrypoint_require: entrypoint_require, namespace: namespace) : "gem_version"
    +  rewritten = replace_gemspec_version_assignment(content, receiver: receiver, rhs: rhs)
    +  modern ? remove_gemspec_legacy_version_loader_preamble(rewritten) : ensure_gemspec_legacy_version_loader_preamble(rewritten, entrypoint_require: entrypoint_require, namespace: namespace, min_ruby: min_ruby_version)
    +rescue ArgumentError, Ast::Crispr::Error
    +  content
     end
    @@ -44321,9 +60802,9 @@

    -

    +

    -6368 -6369 -6370 -6371 -6372 -6373 -6374 -6375 -6376 -6377 -6378 -6379 -6380 -6381 -6382 -6383 -6384 -6385 -6386 +5284 +5285 +5286 +5287 +5288 +5289 +5290 +5291 +5292 +5293 +5294 +5295 +5296 +5297 -
    # File 'lib/kettle/jem.rb', line 6368
    +      
    # File 'lib/kettle/jem.rb', line 5284
     
    -def remove_gemspec_development_dependencies_already_runtime(content, receiver:)
    -  records = gemspec_dependency_records(content, receiver: receiver)
    -  runtime_names = records.each_with_object(Set.new) do |record, names|
    -    next if record.fetch(:kind) == "add_development_dependency"
    -
    -    names << record.fetch(:name)
    -  end
    -  return content if runtime_names.empty?
    -
    -  duplicate_development_records = records.select do |record|
    -    record.fetch(:kind) == "add_development_dependency" && runtime_names.include?(record.fetch(:name))
    -  end
    -  return content if duplicate_development_records.empty?
    +def rewrite_markdown_reference_links(content, links)
    +  ensure_runtime_dependencies!
    +  context = Ast::Crispr::Markdown::Markly.document_context(content: content, source_label: "README.md")
    +  context.structural_owners(owner_scope: :link_definitions).reduce(content.to_s) do |processed, owner|
    +    replacement = links[owner.url.to_s]
    +    next processed unless replacement
     
    -   = duplicate_development_records.to_h do |record|
    -    [record.fetch(:start_line), record.merge(replacement: "")]
    +    replace_markdown_with_ast_crispr(
    +      processed,
    +      Ast::Crispr::Markdown::Markly::Selectors.link_definition(label: owner.label, limit: {exactly: 1}),
    +      markdown_link_definition_source(owner, replacement)
    +    )
       end
    -  replace_record_ranges(content, )
     end
    @@ -44383,9 +60854,9 @@

    -

    +

    - .remove_gemspec_legacy_version_loader_preamble(content) ⇒ Object + .rubocop_target_ruby_token(min_ruby) ⇒ Object @@ -44397,31 +60868,27 @@

    -6022 -6023 -6024 -6025 -6026 -6027 -6028 -6029 -6030 -6031 -6032

    +12333 +12334 +12335 +12336 +12337 +12338 +12339 +12340 +12341 -
    # File 'lib/kettle/jem.rb', line 6022
    -
    -def remove_gemspec_legacy_version_loader_preamble(content)
    -  node = gemspec_top_level_gem_version_node(content)
    -  unless node
    -    fallback_range = gemspec_legacy_version_loader_preamble_line_range(content)
    -    return content unless fallback_range
    +      
    # File 'lib/kettle/jem.rb', line 12333
     
    -    return replace_source_range_lines(content, fallback_range.fetch(:start_line), fallback_range.fetch(:end_line), "")
    -  end
    +def rubocop_target_ruby_token(min_ruby)
    +  token = minimum_ruby_token(min_ruby)
    +  return "0" if token == "0"
     
    -  replace_source_range_lines(content, node.location.start_line, expand_line_range_through_following_blanks(content, node.location.end_line), "")
    +  segments = Gem::Version.new(token).segments
    +  segments.first(2).join(".")
    +rescue ArgumentError
    +  ""
     end
    @@ -44429,9 +60896,9 @@

    -

    +

    - .remove_gemspec_self_dependency_lines(content, package_name, receiver:) ⇒ Object + .rubocop_template_tokens(min_ruby, ruby_style: {}) ⇒ Object @@ -44443,35 +60910,31 @@

     
     
    -6448
    -6449
    -6450
    -6451
    -6452
    -6453
    -6454
    -6455
    -6456
    -6457
    -6458
    -6459
    -6460
    +12263 +12264 +12265 +12266 +12267 +12268 +12269 +12270 +12271 +12272 +12273

    -
    # File 'lib/kettle/jem.rb', line 6448
    -
    -def remove_gemspec_self_dependency_lines(content, package_name, receiver:)
    -  name = package_name.to_s
    -  return content if name.empty?
    +      
    # File 'lib/kettle/jem.rb', line 12263
     
    -  remove_indexes = Set.new
    -  gemspec_dependency_records(content, receiver: receiver).each do |record|
    -    next unless record.fetch(:name) == name
    -
    -    (record.fetch(:start_line)..record.fetch(:end_line)).each { |line_number| remove_indexes << (line_number - 1) }
    -  end
    -  lines = content.to_s.lines.each_with_index.reject { |_line, index| remove_indexes.include?(index) }.map(&:first)
    -  ensure_trailing_newline(lines.join.gsub(/\n{3,}/, "\n\n"))
    +def rubocop_template_tokens(min_ruby, ruby_style: {})
    +  constraint, gem_name, gem_constraint = rubocop_tokens_for(min_ruby_version(min_ruby))
    +  {
    +    "KJ|RUBOCOP_TARGET_RUBY" => rubocop_target_ruby_token(min_ruby),
    +    "KJ|RUBOCOP_LTS_CONSTRAINT" => constraint,
    +    "KJ|RUBOCOP_RUBY_GEM" => gem_name,
    +    "KJ|RUBOCOP_RUBY_CONSTRAINT" => gem_constraint
    +  }.merge(
    +    ruby_style_template_tokens(ruby_style)
    +  )
     end
    @@ -44479,9 +60942,9 @@

    -

    +

    - .remove_gemspec_version_gem_dependency_when_runtime_incompatible(content, facts, receiver:) ⇒ Object + .rubocop_tokens_for(min_ruby) ⇒ Object @@ -44493,21 +60956,15 @@

    -6119 -6120 -6121 -6122 -6123 -6124 +12343 +12344 +12345 -
    # File 'lib/kettle/jem.rb', line 6119
    -
    -def remove_gemspec_version_gem_dependency_when_runtime_incompatible(content, facts, receiver:)
    -  return content if version_gem_runtime_compatible?(facts)
    +      
    # File 'lib/kettle/jem.rb', line 12343
     
    -  cleaned = remove_gemspec_dependency_lines(content, receiver: receiver, names: ["version_gem"], runtime_only: true)
    -  remove_ruby_comment_lines_containing(cleaned, "version_gem")
    +def rubocop_tokens_for(min_ruby)
    +  Kettle::Rb::CompatMatrix.rubocop_template_tokens(min_ruby)
     end
    @@ -44515,9 +60972,9 @@

    -

    +

    - .remove_legacy_version_signature_alias(project_root, signature_path) ⇒ Object + .ruby_appraisal_name_version(name) ⇒ Object @@ -44529,27 +60986,29 @@

     
     
    -8692
    -8693
    -8694
    -8695
    -8696
    -8697
    -8698
    -8699
    -8700
    +7325 +7326 +7327 +7328 +7329 +7330 +7331 +7332 +7333 +7334

    -
    # File 'lib/kettle/jem.rb', line 8692
    +      
    # File 'lib/kettle/jem.rb', line 7325
     
    -def remove_legacy_version_signature_alias(project_root, signature_path)
    -  current = read_project_file(project_root, signature_path)
    -  return nil if current.empty?
    +def ruby_appraisal_name_version(name)
    +  text = name.to_s
    +  return unless text.start_with?("ruby-")
     
    -  cleaned = current.lines.reject { |line| line.strip == "VERSION: String" }.join
    -  return nil if cleaned == current
    +  major, minor, extra = text.delete_prefix("ruby-").split("-", -1)
    +  return if extra || major.to_s.empty? || minor.to_s.empty?
    +  return unless [major, minor].all? { |part| part.each_char.all? { |char| char.between?("0", "9") } }
     
    -  write_if_changed(project_root, signature_path, cleaned)
    +  Gem::Version.new("#{major}.#{minor}")
     end
    @@ -44557,9 +61016,9 @@

    -

    +

    - .remove_readme_badge_and_refs(content, badge_source, link_labels) ⇒ Object + .ruby_appraisal_names_below(content, min_ruby) ⇒ Object @@ -44571,29 +61030,31 @@

     
     
    -4490
    -4491
    -4492
    -4493
    -4494
    -4495
    -4496
    -4497
    -4498
    -4499
    +4838 +4839 +4840 +4841 +4842 +4843 +4844 +4845 +4846 +4847 +4848 -
    # File 'lib/kettle/jem.rb', line 4490
    +      
    # File 'lib/kettle/jem.rb', line 4838
     
    -def remove_readme_badge_and_refs(content, badge_source, link_labels)
    -  processed = content.to_s.gsub(badge_source, "").lines.map(&:rstrip).join("\n")
    -  processed = "#{processed}\n" if content.to_s.end_with?("\n")
    -  Array(link_labels).reduce(processed) do |memo, label|
    -    delete_markdown_with_ast_crispr(
    -      memo,
    -      Ast::Crispr::Markdown::Markly::Selectors.link_definition(label: label, limit: {at_least: 0})
    -    )
    +def ruby_appraisal_names_below(content, min_ruby)
    +  return [] if min_ruby.to_s.empty?
    +
    +  minimum = Gem::Version.new(min_ruby.to_s)
    +  appraisal_names(content).select do |name|
    +    version = ruby_appraisal_name_version(name)
    +    version && version < minimum
       end
    +rescue ArgumentError
    +  []
     end
    @@ -44601,9 +61062,9 @@

    -

    +

    - .remove_readme_sections(content, section_bases) ⇒ Object + .ruby_array_literal(values) ⇒ Object @@ -44615,35 +61076,15 @@

     
     
    -4743
    -4744
    -4745
    -4746
    -4747
    -4748
    -4749
    -4750
    -4751
    -4752
    -4753
    -4754
    -4755
    +10695 +10696 +10697 -
    # File 'lib/kettle/jem.rb', line 4743
    -
    -def remove_readme_sections(content, section_bases)
    -  bases = section_bases.map { |section| normalize_readme_heading(section) }.uniq
    -  return content if bases.empty?
    +      
    # File 'lib/kettle/jem.rb', line 10695
     
    -  sections = markdown_sections(content).select { |section| bases.include?(section.fetch(:base)) }
    -  return content if sections.empty?
    -
    -  lines = content.to_s.split("\n", -1)
    -  sections.reverse_each do |section|
    -    lines[section.fetch(:start)..section.fetch(:end)] = []
    -  end
    -  ensure_trailing_newline(lines.join("\n").gsub(/\n{3,}/, "\n\n").strip)
    +def ruby_array_literal(values)
    +  "[#{Array(values).map { |value| %("#{ruby_double_quoted_string_body(value.to_s)}") }.join(", ")}]"
     end
    @@ -44651,49 +61092,62 @@

    -

    +

    - .remove_ruby_comment_lines_containing(content, text) ⇒ Object + .ruby_bucket_path_segment?(segment) ⇒ Boolean -

    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -44701,9 +61155,9 @@

    -

    +

    - .remove_top_level_yaml_key_lines(content, key) ⇒ Object + .ruby_call_records(content, call_name) ⇒ Object @@ -44715,49 +61169,25 @@

     
     
    -10933
    -10934
    -10935
    -10936
    -10937
    -10938
    -10939
    -10940
    -10941
    -10942
    -10943
    -10944
    -10945
    -10946
    -10947
    -10948
    -10949
    -10950
    -10951
    -10952
    +6676 +6677 +6678 +6679 +6680 +6681 +6682 +6683

    @@ -44765,9 +61195,9 @@

    -

    +

    - .remove_version_gem_entrypoint_references(content) ⇒ Object + .ruby_constant_path_segments(node) ⇒ Object @@ -44779,41 +61209,15 @@

    -8772 -8773 -8774 -8775 -8776 -8777 -8778 -8779 -8780 -8781 -8782 -8783 -8784 -8785 -8786 -8787 +11688 +11689 +11690

    @@ -44821,9 +61225,9 @@

    -

    +

    - .remove_yaml_scalar_path(content, path) ⇒ Object + .ruby_double_quoted_string_body(value) ⇒ Object @@ -44835,29 +61239,15 @@

     
     
    -6818
    -6819
    -6820
    -6821
    -6822
    -6823
    -6824
    -6825
    -6826
    -6827
    +9466 +9467 +9468

    @@ -44865,9 +61255,9 @@

    -

    +

    - .render_thin_readme(facts, readme_style, original, preserve_config) ⇒ Object + .ruby_engines_config(config) ⇒ Object @@ -44879,85 +61269,21 @@

     
     
    -3491
    -3492
    -3493
    -3494
    -3495
    -3496
    -3497
    -3498
    -3499
    -3500
    -3501
    -3502
    -3503
    -3504
    -3505
    -3506
    -3507
    -3508
    -3509
    -3510
    -3511
    -3512
    -3513
    -3514
    -3515
    -3516
    -3517
    -3518
    -3519
    -3520
    -3521
    -3522
    -3523
    -3524
    -3525
    -3526
    -3527
    -3528
    +9741 +9742 +9743 +9744 +9745 +9746

    @@ -44965,9 +61291,9 @@

    -

    +

    - .replace_existing_markdown_managed_block(content, marker, replacement) ⇒ Object + .ruby_entrypoint_module_namespace(content) ⇒ Object @@ -44979,23 +61305,25 @@

    -11592 -11593 -11594 -11595 -11596 -11597 -11598 +11707 +11708 +11709 +11710 +11711 +11712 +11713 +11714

    @@ -45003,9 +61331,9 @@

    -

    +

    - .replace_gemspec_assignment_sources(content, replacements, receiver:) ⇒ Object + .ruby_entrypoint_module_namespace_for(node, namespace) ⇒ Object @@ -45017,31 +61345,29 @@

     
     
    -6271
    -6272
    -6273
    -6274
    -6275
    -6276
    -6277
    -6278
    -6279
    -6280
    -6281
    +11716 +11717 +11718 +11719 +11720 +11721 +11722 +11723 +11724 +11725

    @@ -45049,9 +61375,9 @@

    -

    +

    - .replace_gemspec_version_assignment(content, receiver:, rhs:) ⇒ Object + .ruby_first_simple_quoted_string_node(node) ⇒ Object @@ -45063,29 +61389,37 @@

     
     
    -5979
    -5980
    -5981
    -5982
    -5983
    -5984
    -5985
    -5986
    -5987
    -5988
    +8653 +8654 +8655 +8656 +8657 +8658 +8659 +8660 +8661 +8662 +8663 +8664 +8665 +8666

    @@ -45093,60 +61427,31 @@

    -

    - - .replace_kettle_config_bootstrap_licenses(content, licenses) ⇒ Object +

    - + .ruby_first_string_argument(owner) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Raises:

    -
      - -
    • - - - (Error) - - - -
    • -
    - -

     
     
    -6146
    -6147
    -6148
    -6149
    -6150
    -6151
    -6152
    -6153
    -6154
    -6155
    -6156
    -6157
    -6158
    +6971 +6972 +6973 +6974 +6975 +6976 +6977 +6978
    -
    # File 'lib/kettle/jem.rb', line 6146
    -
    -def remove_ruby_comment_lines_containing(content, text)
    -  result = prism_parse_success(content)
    -  return content unless result
    +      
    # File 'lib/kettle/jem.rb', line 6971
     
    -  selectors = result.comments.filter_map do |comment|
    -    next unless comment.location.slice.include?(text.to_s)
    +def ruby_bucket_path_segment?(segment)
    +  return false unless segment.to_s.start_with?("r")
     
    -    {start_line: comment.location.start_line, end_line: comment.location.end_line}
    -  end
    -  return content if selectors.empty?
    +  version = segment.to_s[1..].to_s
    +  return false if version.empty?
     
    -  ensure_trailing_newline(delete_line_ranges(content.to_s, selectors))
    +  version.split(".", -1).all? { |part| !part.empty? && part.each_char.all? { |char| char.between?("0", "9") } }
     end
    -
    # File 'lib/kettle/jem.rb', line 10933
    -
    -def remove_top_level_yaml_key_lines(content, key)
    -  lines = content.to_s.lines
    -  document = Psych.parse_stream(content.to_s).children.first
    -  root = document&.root
    -  return content unless root.is_a?(Psych::Nodes::Mapping)
    +      
    # File 'lib/kettle/jem.rb', line 6676
     
    -  pairs = root.children.each_slice(2).to_a
    -  pairs.each_with_index do |(key_node, value_node), index|
    -    next unless key_node.is_a?(Psych::Nodes::Scalar) && key_node.value.to_s == key.to_s
    +def ruby_call_records(content, call_name)
    +  result = prism_parse_success(content)
    +  return [] unless result
     
    -    next_key = pairs[index + 1]&.first
    -    end_line = next_key&.start_line || value_node.end_line
    -    end_line += 1 if end_line <= key_node.start_line
    -    return [*lines[0...key_node.start_line], *lines[end_line..].to_a].join
    +  result.value.breadth_first_search_all do |node|
    +    node.is_a?(::Prism::CallNode) && (call_name.nil? || node.name == call_name)
       end
    -
    -  content
    -rescue Psych::Exception
    -  content
     end
    -
    # File 'lib/kettle/jem.rb', line 8772
    -
    -def remove_version_gem_entrypoint_references(content)
    -  selectors = []
    -  top_level_ruby_call_records(content, :require).each do |call|
    -    next unless ruby_string_argument(call) == "version_gem"
    -
    -    selectors << {start_line: call.location.start_line, end_line: call.location.end_line}
    -  end
    -  top_level_ruby_call_records(content, :class_eval).each do |call|
    -    next unless version_gem_class_eval_call?(call)
    -
    -    selectors << {start_line: call.location.start_line, end_line: call.location.end_line}
    -  end
    -  return content.to_s if selectors.empty?
    +      
    # File 'lib/kettle/jem.rb', line 11688
     
    -  collapse_excess_blank_lines(delete_line_ranges(content.to_s, selectors))
    +def ruby_constant_path_segments(node)
    +  node&.slice.to_s.split("::").reject(&:empty?)
     end
    -
    # File 'lib/kettle/jem.rb', line 6818
    -
    -def remove_yaml_scalar_path(content, path)
    -  lines = content.to_s.lines
    -  yaml_scalar_path_entries(content).each do |entry|
    -    next unless entry.fetch(:path) == path
    +      
    # File 'lib/kettle/jem.rb', line 9466
     
    -    line_index = entry.fetch(:line)
    -    return ensure_trailing_newline(lines.each_with_index.reject { |_line, index| index == line_index }.map(&:first).join)
    -  end
    -  content
    +def ruby_double_quoted_string_body(value)
    +  value.to_s.gsub("\\", "\\\\\\").gsub('"', '\"')
     end
    -
    # File 'lib/kettle/jem.rb', line 3491
    +      
    # File 'lib/kettle/jem.rb', line 9741
     
    -def render_thin_readme(facts, readme_style, original, preserve_config)
    -  package = facts.fetch(:package)
    -  rubygems = facts.fetch(:rubygems)
    -  license_expression = package[:license_expression].to_s
    -  min_ruby = minimum_ruby_token(rubygems[:min_ruby])
    -  title = classify_namespace(package.fetch(:name))
    -  badges = [
    -    package[:source_url] && "[![Source](https://img.shields.io/badge/source-github-238636.svg)](#{package[:source_url]})",
    -    license_expression.empty? ? nil : "![License](https://img.shields.io/badge/license-#{shield_token(license_expression)}-259D6C.svg)"
    -  ].compact.join(" ")
    -  funding_enabled = readme_style.fetch(:floss_funding_enabled, false)
    -  security_enabled = readme_style.fetch(:security_enabled, false)
    -  section_partials = readme_section_partials_for_render(readme_style, facts)
    -  rendered = [
    -    "# 💎 #{title}",
    -    badges,
    -    "## 🌻 Synopsis\n\n#{section_partials.fetch("synopsis", "")}",
    -    "## 💡 Info you can shake a stick at\n\nCompatible with MRI Ruby #{min_ruby}+.\n\n#{readme_family_intro_and_backend_matrix(readme_style)}",
    -    "## ✨ Installation\n\n```console\ngem install #{package.fetch(:name)}\n```",
    -    "## ⚙️ Configuration\n\n#{section_partials.fetch("configuration", "")}",
    -    "## 🔧 Basic Usage\n\n#{section_partials.fetch("basic usage", "")}"
    -  ]
    -  rendered << "## 🦷 FLOSS Funding\n\nThis free software project accepts funding support when configured by the package maintainer." if funding_enabled
    -  rendered << "## 🔐 Security\n\nSee [SECURITY.md](SECURITY.md)." if security_enabled
    -  rendered.concat([
    -    "## 🤝 Contributing\n\nContributions are welcome. Missing optional service integrations are reported by the generator instead of rendered as broken badges.",
    -    "## 📌 Versioning\n\nThis project follows semantic versioning for its public API where practical.",
    -    "## 📄 License\n\nThis project is made available under the following license expression: #{license_expression.empty? ? "unspecified" : license_expression}.",
    -    "## 🤑 A request for help\n\nPlease support the project by using it, reporting issues, and contributing improvements."
    -  ])
    -  template_content = rendered.reject(&:empty?).join("\n\n") + "\n"
    +def ruby_engines_config(config)
    +  engines = config["engines"]
    +  return unless engines.is_a?(Array)
     
    -  merge_readme_template(
    -    template_content: template_content,
    -    destination_content: original,
    -    preserve_config: readme_preserve_config_without_partial_sections(preserve_config, section_partials.keys)
    -  )
    +  engines.map { |engine| engine.to_s.strip.downcase }.reject(&:empty?).uniq
     end
    -
    # File 'lib/kettle/jem.rb', line 11592
    +      
    # File 'lib/kettle/jem.rb', line 11707
     
    -def replace_existing_markdown_managed_block(content, marker, replacement)
    -  open = "<!-- #{marker}:start -->"
    -  close = "<!-- #{marker}:end -->"
    -  replace_markdown_managed_block_with_crispr(content, open, close, replacement) do
    -    content
    +def ruby_entrypoint_module_namespace(content)
    +  body = prism_parse_success(content)&.value&.statements&.body || []
    +  body.each do |node|
    +    namespace = ruby_entrypoint_module_namespace_for(node, [])
    +    return namespace if namespace
       end
    +  nil
     end
    -
    # File 'lib/kettle/jem.rb', line 6271
    -
    -def replace_gemspec_assignment_sources(content, replacements, receiver:)
    -  return content if replacements.empty?
    +      
    # File 'lib/kettle/jem.rb', line 11716
     
    -   = gemspec_assignment_records(content, receiver: receiver).each_with_object({}) do |record, index|
    -    field = record.fetch(:field)
    -    next unless replacements.key?(field)
    +def ruby_entrypoint_module_namespace_for(node, namespace)
    +  return unless node.is_a?(::Prism::ModuleNode)
     
    -    index[record.fetch(:start_line)] = record.merge(replacement: "#{replacements.fetch(field)}\n")
    +  current = namespace + ruby_constant_path_segments(node.constant_path)
    +  node.body&.body&.each do |child|
    +    child_namespace = ruby_entrypoint_module_namespace_for(child, current)
    +    return child_namespace if child_namespace
       end
    -  replace_record_ranges(content, )
    +  current.join("::") unless current.empty?
     end
    -
    # File 'lib/kettle/jem.rb', line 5979
    -
    -def replace_gemspec_version_assignment(content, receiver:, rhs:)
    -  replacement = "#{receiver}.version = #{rhs}"
    -  record = gemspec_assignment_records(content, receiver: receiver).find { |candidate| candidate.fetch(:field) == "version" }
    -  return replace_source_range_lines(content, record.fetch(:start_line), record.fetch(:end_line), "#{leading_whitespace(record.fetch(:source))}#{replacement}\n") if record
    -
    -  name = gemspec_assignment_records(content, receiver: receiver).find { |candidate| candidate.fetch(:field) == "name" }
    -  return insert_lines_after(content, name.fetch(:end_line), "  #{replacement}\n") if name
    +      
    # File 'lib/kettle/jem.rb', line 8653
     
    -  insert_lines_after(content, gemspec_new_call(content)&.location&.start_line || 1, "  #{replacement}\n")
    +def ruby_first_simple_quoted_string_node(node)
    +  case node
    +  when ::Prism::StringNode
    +    node if ruby_simple_quoted_string_node?(node)
    +  when ::Prism::InterpolatedStringNode
    +    node.compact_child_nodes.each do |child|
    +      string_node = ruby_first_simple_quoted_string_node(child)
    +      return string_node if string_node
    +    end
    +    nil
    +  when ::Prism::CallNode
    +    ruby_first_simple_quoted_string_node(node.receiver)
    +  end
     end
    +
    @@ -45154,58 +61459,77 @@

    -

    +

    - .replace_kettle_config_bootstrap_project_emoji(content, emoji) ⇒ Object + .ruby_keyword_argument_node(call, key) ⇒ Object -

    -
    - +
     
     
    -6667
    -6668
    -6669
    -6670
    -6671
    -6672
    -6673
    +11589 +11590 +11591 +11592
    -
    # File 'lib/kettle/jem.rb', line 6667
    -
    -def replace_kettle_config_bootstrap_licenses(content, licenses)
    -  license_block = ["licenses:", *licenses.map { |license_id| "  - #{license_id}" }].join("\n")
    -  updated = replace_yaml_node_lines(content, "licenses", "#{license_block}\n")
    -  return updated unless updated == content
    +      
    # File 'lib/kettle/jem.rb', line 11589
     
    -  raise Error, "Could not replace licenses block in .kettle-jem.yml bootstrap template"
    +def ruby_first_string_argument(owner)
    +  argument = owner.arguments&.arguments&.first
    +  argument.respond_to?(:unescaped) ? argument.unescaped : nil
     end
    + + + + +
    +
     
     
    -  
    +4826
    +4827
    +4828
    +4829
    +4830
    +4831
    +4832
    +
    +
    # File 'lib/kettle/jem.rb', line 4826
    +
    +def ruby_keyword_argument_node(call, key)
    +  keyword_hash = Array(call&.arguments&.arguments).find { |argument| argument.is_a?(::Prism::KeywordHashNode) }
    +  assoc = keyword_hash&.elements&.find do |element|
    +    element.respond_to?(:key) && element.key.respond_to?(:unescaped) && element.key.unescaped == key.to_s
    +  end
    +  assoc&.value
    +end
    +
    -
    + +
    +

    -

    Raises:

    -
      + .ruby_keyword_string_argument(call, key) ⇒ Object -
    • - - - (Error) - - - -
    • + -
    -

    + +
    @@ -45213,9 +61537,9 @@

    -

    +

    - .replace_local_gems_assignment(content, gems) ⇒ Object + .ruby_local_word_array_assignments(root) ⇒ Object @@ -45227,28 +61551,22 @@

     
     
    -4880
    -4881
    -4882
    -4883
    -4884
    -4885
    -4886
    -4887
    -4888
    -4889
    +4805 +4806 +4807 +4808 +4809 +4810 +4811

    @@ -45257,9 +61575,9 @@

    -

    +

    - .replace_markdown_managed_block(content, marker, replacement) ⇒ Object + .ruby_merge_options(recipe, merge_template_requires:) ⇒ Object @@ -45271,23 +61589,25 @@

     
     
    -11584
    -11585
    -11586
    -11587
    -11588
    -11589
    -11590
    +6389 +6390 +6391 +6392 +6393 +6394 +6395 +6396

    @@ -45295,9 +61615,9 @@

    -

    +

    - .replace_markdown_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object + .ruby_method_move_policy(recipe) ⇒ Object @@ -45309,45 +61629,17 @@

    -11612 -11613 -11614 -11615 -11616 -11617 -11618 -11619 -11620 -11621 -11622 -11623 -11624 -11625 -11626 -11627 -11628 -11629 +6364 +6365 +6366 +6367

    @@ -45355,9 +61647,9 @@

    -

    +

    - .replace_markdown_with_ast_crispr(content, target, replacement) ⇒ Object + .ruby_multiline_word_array_source(names, indent:) ⇒ Object @@ -45369,25 +61661,19 @@

     
     
    -4619
    -4620
    -4621
    -4622
    -4623
    -4624
    -4625
    -4626
    +6860 +6861 +6862 +6863 +6864

    @@ -45395,9 +61681,9 @@

    -

    +

    - .replace_matching_gemspec_dependency_lines(content, destination_dependencies, receiver:) ⇒ Object + .ruby_node_source_end_line(node) ⇒ Object @@ -45409,23 +61695,29 @@

    -6343 -6344 -6345 -6346 -6347 -6348 -6349 +6685 +6686 +6687 +6688 +6689 +6690 +6691 +6692 +6693 +6694

    @@ -45433,57 +61725,62 @@

    -

    +

    - .replace_record_ranges(content, records_by_line) ⇒ Object + .ruby_project_version_constant_path?(node, namespace:) ⇒ Boolean -

     
     
    -6660
    -6661
    -6662
    -6663
    -6664
    -6665
    +6747 +6748 +6749 +6750 +6751 +6752 +6753 +6754
    -
    # File 'lib/kettle/jem.rb', line 6660
    -
    -def replace_kettle_config_bootstrap_project_emoji(content, emoji)
    -  updated = replace_yaml_scalar_line(content, "project_emoji", emoji.to_s)
    -  return updated unless updated == content
    +      
    # File 'lib/kettle/jem.rb', line 6747
     
    -  raise Error, "Could not replace project_emoji in .kettle-jem.yml bootstrap template"
    +def ruby_keyword_string_argument(call, key)
    +  keyword_hash = Array(call&.arguments&.arguments).find { |argument| argument.is_a?(::Prism::KeywordHashNode) }
    +  assoc = keyword_hash&.elements&.find do |element|
    +    element.respond_to?(:key) && element.key.respond_to?(:unescaped) && element.key.unescaped == key.to_s
    +  end
    +  value = assoc&.value
    +  ruby_static_string_value(value)
     end
    -
    # File 'lib/kettle/jem.rb', line 4880
    +      
    # File 'lib/kettle/jem.rb', line 4805
     
    -def replace_local_gems_assignment(content, gems)
    -  replacement = ["local_gems = %w["]
    -  gems.each { |gem_name| replacement << "  #{gem_name}" }
    -  replacement << "]"
    -  if (record = local_gems_assignment_record(content))
    -    replace_source_range_lines(content, record.fetch(:start_line), record.fetch(:end_line), ensure_trailing_newline(replacement.join("\n")))
    -  else
    -    ensure_trailing_newline([content.to_s.rstrip, replacement.join("\n")].reject(&:empty?).join("\n\n"))
    +def ruby_local_word_array_assignments(root)
    +  root.breadth_first_search_all do |node|
    +    node.is_a?(::Prism::LocalVariableWriteNode) && ruby_word_array_node?(node.value)
    +  end.to_h do |node|
    +    [node.name.to_s, ruby_word_array_names(node.value)]
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 11584
    +      
    # File 'lib/kettle/jem.rb', line 6389
     
    -def replace_markdown_managed_block(content, marker, replacement)
    -  open = "<!-- #{marker}:start -->"
    -  close = "<!-- #{marker}:end -->"
    -  replace_markdown_managed_block_with_crispr(content, open, close, replacement) do
    -    ensure_trailing_newline([content.rstrip, "", replacement.to_s.rstrip].join("\n"))
    +def ruby_merge_options(recipe, merge_template_requires:)
    +  options = {merge_template_requires: merge_template_requires}
    +  parameters = Ruby::Merge.method(:merge_ruby).parameters
    +  if parameters.include?([:key, :method_move_policy]) || parameters.any? { |kind, _name| kind == :keyrest }
    +    options[:method_move_policy] = ruby_method_move_policy(recipe)
       end
    +  options
     end
    -
    # File 'lib/kettle/jem.rb', line 11612
    -
    -def replace_markdown_managed_block_with_crispr(content, open_marker, close_marker, replacement)
    -  prepared_replacement = ensure_trailing_newline(replacement.to_s)
    -  actor = Ast::Crispr::Replace.call(
    -    content: content.to_s,
    -    target: Ast::Crispr::Markdown::Markly::Selectors.html_comment_block(
    -      start_text: open_marker.delete_prefix("<!-- ").delete_suffix(" -->"),
    -      end_text: close_marker.delete_prefix("<!-- ").delete_suffix(" -->"),
    -      span: :outermost,
    -      include_trailing_gap: true,
    -      limit: {none_or_one: true}
    -    ),
    -    replacement: prepared_replacement,
    -    source_label: "managed markdown block"
    -  )
    -  return actor.updated_content if actor.match_count.positive?
    +      
    # File 'lib/kettle/jem.rb', line 6364
     
    -  yield
    +def ruby_method_move_policy(recipe)
    +  recipe.dig(:template_preference, :method_move_policy) ||
    +    (Ruby::Merge.const_defined?(:DEFAULT_METHOD_MOVE_POLICY) ? Ruby::Merge::DEFAULT_METHOD_MOVE_POLICY : DEFAULT_RUBY_METHOD_MOVE_POLICY)
     end
    -
    # File 'lib/kettle/jem.rb', line 4619
    +      
    # File 'lib/kettle/jem.rb', line 6860
     
    -def replace_markdown_with_ast_crispr(content, target, replacement)
    -  Ast::Crispr::Replace.call(
    -    content: content.to_s,
    -    target: target,
    -    replacement: replacement,
    -    source_label: "README.md"
    -  ).updated_content
    +def ruby_multiline_word_array_source(names, indent:)
    +  prefix = " " * indent.to_i
    +  element_prefix = "#{prefix}  "
    +  (["#{prefix}%w["] + names.map { |name| "#{element_prefix}#{name}" } + ["#{prefix}]"]).join("\n")
     end
    -
    # File 'lib/kettle/jem.rb', line 6343
    +      
    # File 'lib/kettle/jem.rb', line 6685
     
    -def replace_matching_gemspec_dependency_lines(content, destination_dependencies, receiver:)
    -   = gemspec_dependency_records(content, receiver: receiver).each_with_object({}) do |record, index|
    -    replacement = destination_dependencies[gemspec_dependency_record_key(record)]
    -    index[record.fetch(:start_line)] = record.merge(replacement: replacement) if replacement
    +def ruby_node_source_end_line(node)
    +  return 0 unless node
    +
    +  lines = [node.location&.end_line]
    +  lines << node.closing_loc&.start_line if node.respond_to?(:closing_loc)
    +  node.compact_child_nodes.each do |child|
    +    lines << ruby_node_source_end_line(child)
       end
    -  replace_record_ranges(content, )
    +  lines.compact.max.to_i
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -45491,33 +61788,58 @@

    -

    +

    - .replace_ruby_managed_block(content, replacement) ⇒ Object + .ruby_project_version_embedded_statements?(node, namespace:) ⇒ Boolean -

     
     
    -6547
    -6548
    -6549
    -6550
    -6551
    -6552
    -6553
    -6554
    -6555
    -6556
    -6557
    -6558
    -6559
    -6560
    -6561
    -6562
    -6563
    +8375 +8376 +8377 +8378 +8379 +8380 +8381 +8382
    -
    # File 'lib/kettle/jem.rb', line 6547
    -
    -def replace_record_ranges(content, )
    -  return content if .empty?
    +      
    # File 'lib/kettle/jem.rb', line 8375
     
    -  skip_until = 0
    -  content.to_s.lines.each_with_index.flat_map do |line, index|
    -    line_number = index + 1
    -    next [] if line_number < skip_until
    +def ruby_project_version_constant_path?(node, namespace:)
    +  return false unless node.is_a?(::Prism::ConstantPathNode)
     
    -    record = [line_number]
    -    if record
    -      skip_until = record.fetch(:end_line) + 1
    -      record.fetch(:replacement)
    -    else
    -      line
    -    end
    -  end.join
    +  segments = ruby_constant_path_segments(node)
    +  namespace_segments = namespace.to_s.split("::").reject(&:empty?)
    +  segments == namespace_segments + ["VERSION"] ||
    +    segments == namespace_segments + ["Version", "VERSION"]
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -45525,9 +61847,9 @@

    -

    +

    - .replace_ruby_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object + .ruby_project_version_interpolated_string_source(node, receiver:, namespace:) ⇒ Object @@ -45539,45 +61861,43 @@

     
     
    -11649
    -11650
    -11651
    -11652
    -11653
    -11654
    -11655
    -11656
    -11657
    -11658
    -11659
    -11660
    -11661
    -11662
    -11663
    -11664
    -11665
    -11666
    +8350 +8351 +8352 +8353 +8354 +8355 +8356 +8357 +8358 +8359 +8360 +8361 +8362 +8363 +8364 +8365 +8366

    @@ -45585,9 +61905,9 @@

    -

    +

    - .replace_source_offsets(content, replacements) ⇒ Object + .ruby_require_aliases(recipe, facts = nil) ⇒ Object @@ -45599,23 +61919,33 @@

     
     
    -5492
    -5493
    -5494
    -5495
    -5496
    -5497
    -5498
    +6431 +6432 +6433 +6434 +6435 +6436 +6437 +6438 +6439 +6440 +6441 +6442

    @@ -45623,29 +61953,56 @@

    -

    +

    - .replace_source_range_lines(content, start_line, end_line, replacement) ⇒ Object + .ruby_require_call?(owner, method_name, argument) ⇒ Boolean -

     
     
    -11606
    -11607
    -11608
    -11609
    -11610
    +8368 +8369 +8370 +8371 +8372 +8373
    -
    # File 'lib/kettle/jem.rb', line 11606
    +      
    # File 'lib/kettle/jem.rb', line 8368
     
    -def replace_ruby_managed_block(content, replacement)
    -  replace_ruby_managed_block_with_crispr(content, MANAGED_BLOCK_OPEN, MANAGED_BLOCK_CLOSE, replacement) do
    -    ensure_trailing_newline([content.rstrip, replacement.to_s.rstrip].reject(&:empty?).join("\n"))
    -  end
    +def ruby_project_version_embedded_statements?(node, namespace:)
    +  body = node.statements&.body.to_a
    +  return false unless body.length == 1
    +
    +  ruby_project_version_constant_path?(body.first, namespace: namespace)
     end
    -
    # File 'lib/kettle/jem.rb', line 11649
    +      
    # File 'lib/kettle/jem.rb', line 8350
     
    -def replace_ruby_managed_block_with_crispr(content, open_marker, close_marker, replacement)
    -  prepared_replacement = ensure_trailing_newline(replacement.to_s)
    -  actor = Ast::Crispr::Replace.call(
    -    content: content.to_s,
    -    target: Ast::Crispr::Ruby::Prism::Selectors.comment_line_block(
    -      start_text: open_marker,
    -      end_text: close_marker,
    -      span: :outermost,
    -      include_trailing_gap: true,
    -      limit: {none_or_one: true}
    -    ),
    -    replacement: prepared_replacement,
    -    source_label: "managed Ruby block"
    -  )
    -  return actor.updated_content if actor.match_count.positive?
    +def ruby_project_version_interpolated_string_source(node, receiver:, namespace:)
    +  return unless node.is_a?(::Prism::InterpolatedStringNode)
     
    -  yield
    +  parts = node.parts.map do |part|
    +    case part
    +    when ::Prism::StringNode
    +      ruby_double_quoted_string_body(part.unescaped.to_s)
    +    when ::Prism::EmbeddedStatementsNode
    +      next unless ruby_project_version_embedded_statements?(part, namespace: namespace)
    +
    +      "\#{#{receiver}.version}"
    +    end
    +  end
    +  return if parts.any?(&:nil?)
    +
    +  %("#{parts.join}")
     end
    -
    # File 'lib/kettle/jem.rb', line 5492
    +      
    # File 'lib/kettle/jem.rb', line 6431
     
    -def replace_source_offsets(content, replacements)
    -  output = content.to_s.dup
    -  replacements.sort_by { |replacement| -replacement.fetch(:start_offset) }.each do |replacement|
    -    output[replacement.fetch(:start_offset)...replacement.fetch(:end_offset)] = replacement.fetch(:replacement)
    -  end
    -  output
    +def ruby_require_aliases(recipe, facts = nil)
    +  facts ||= recipe[:facts] || recipe["facts"]
    +  return [] unless facts.is_a?(Hash)
    +
    +  package = facts[:package] || facts["package"] || {}
    +  rubygems = facts[:rubygems] || facts["rubygems"] || {}
    +  package_name = (package[:name] || package["name"]).to_s.strip
    +  entrypoint = (rubygems[:entrypoint_require] || rubygems["entrypoint_require"]).to_s.strip
    +  return [] if package_name.empty? || entrypoint.empty? || package_name == entrypoint
    +
    +  [[package_name, entrypoint]]
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -45653,33 +62010,54 @@

    -

    +

    - .replace_text_managed_block(content, replacement) ⇒ Object + .ruby_simple_quoted_string_node?(node) ⇒ Boolean -

     
     
    -6565
    -6566
    -6567
    +11583 +11584 +11585 +11586 +11587
    -
    # File 'lib/kettle/jem.rb', line 6565
    +      
    # File 'lib/kettle/jem.rb', line 11583
     
    -def replace_source_range_lines(content, start_line, end_line, replacement)
    -  replace_record_ranges(content, {start_line => {end_line: end_line, replacement: replacement}})
    +def ruby_require_call?(owner, method_name, argument)
    +  owner.is_a?(::Prism::CallNode) &&
    +    owner.name.to_s == method_name.to_s &&
    +    ruby_first_string_argument(owner).to_s == argument.to_s
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -45687,9 +62065,9 @@

    -

    +

    - .replace_text_managed_block_with_crispr(content, open_marker, close_marker, replacement) ⇒ Object + .ruby_static_interpolated_string_value(node) ⇒ Object @@ -45701,43 +62079,21 @@

     
     
    -11631
    -11632
    -11633
    -11634
    -11635
    -11636
    -11637
    -11638
    -11639
    -11640
    -11641
    -11642
    -11643
    -11644
    -11645
    -11646
    -11647
    +6767 +6768 +6769 +6770 +6771 +6772

    @@ -45745,9 +62101,9 @@

    -

    +

    - .replace_toml_string_scalar_line(content, key, value) ⇒ Object + .ruby_static_string_array_value(node, local_word_arrays = {}) ⇒ Object @@ -45759,31 +62115,33 @@

     
     
    -4329
    -4330
    -4331
    -4332
    -4333
    -4334
    -4335
    -4336
    -4337
    -4338
    -4339
    +4813 +4814 +4815 +4816 +4817 +4818 +4819 +4820 +4821 +4822 +4823 +4824

    @@ -45791,9 +62149,9 @@

    -

    +

    - .replace_yaml_node_lines(content, key, replacement) ⇒ Object + .ruby_static_string_call_value(node) ⇒ Object @@ -45805,35 +62163,51 @@

     
     
    -6876
    -6877
    -6878
    -6879
    -6880
    -6881
    -6882
    -6883
    -6884
    -6885
    -6886
    -6887
    -6888
    +6774 +6775 +6776 +6777 +6778 +6779 +6780 +6781 +6782 +6783 +6784 +6785 +6786 +6787 +6788 +6789 +6790 +6791 +6792 +6793 +6794

    @@ -45841,9 +62215,9 @@

    -

    +

    - .replace_yaml_scalar_line(content, key, value) ⇒ Object + .ruby_static_string_value(node) ⇒ Object @@ -45855,39 +62229,29 @@

     
     
    -6675
    -6676
    -6677
    -6678
    -6679
    -6680
    -6681
    -6682
    -6683
    -6684
    -6685
    -6686
    -6687
    -6688
    -6689
    +6756 +6757 +6758 +6759 +6760 +6761 +6762 +6763 +6764 +6765

    @@ -45895,9 +62259,9 @@

    -

    +

    - .replace_yaml_scalar_path(content, path, value) ⇒ Object + .ruby_string_argument(call) ⇒ Object @@ -45909,41 +62273,15 @@

     
     
    -6801
    -6802
    -6803
    -6804
    -6805
    -6806
    -6807
    -6808
    -6809
    -6810
    -6811
    -6812
    -6813
    -6814
    -6815
    -6816
    +6732 +6733 +6734

    @@ -45951,9 +62289,9 @@

    -

    +

    - .repository_facts(project_root, source_url, package_name:, repository_topology:) ⇒ Object + .ruby_string_argument_at(call, index) ⇒ Object @@ -45965,77 +62303,17 @@

     
     
    -8964
    -8965
    -8966
    -8967
    -8968
    -8969
    -8970
    -8971
    -8972
    -8973
    -8974
    -8975
    -8976
    -8977
    -8978
    -8979
    -8980
    -8981
    -8982
    -8983
    -8984
    -8985
    -8986
    -8987
    -8988
    -8989
    -8990
    -8991
    -8992
    -8993
    -8994
    -8995
    -8996
    -8997
    +6736 +6737 +6738 +6739

    @@ -46043,60 +62321,33 @@

    -

    - - .repository_monorepo_subproject?(repository) ⇒ Boolean +

    - + .ruby_string_arguments(call) ⇒ Object -

    -
    - - -
    -
    -
    - -

    Returns:

    -
      -
    • - - - (Boolean) - - - -
    • - -
    - -

     
     
    -11600
    -11601
    -11602
    -11603
    -11604
    +8668 +8669 +8670 +8671
    -
    # File 'lib/kettle/jem.rb', line 11600
    +      
    # File 'lib/kettle/jem.rb', line 8668
     
    -def replace_text_managed_block(content, replacement)
    -  replace_text_managed_block_with_crispr(content, MANAGED_BLOCK_OPEN, MANAGED_BLOCK_CLOSE, replacement) do
    -    ensure_trailing_newline([content.rstrip, replacement.to_s.rstrip].reject(&:empty?).join("\n"))
    -  end
    +def ruby_simple_quoted_string_node?(node)
    +  opening = node.opening_loc&.slice
    +  opening == '"' || opening == "'"
     end
    -
    # File 'lib/kettle/jem.rb', line 11631
    +      
    # File 'lib/kettle/jem.rb', line 6767
     
    -def replace_text_managed_block_with_crispr(content, open_marker, close_marker, replacement)
    -  prepared_replacement = ensure_trailing_newline(replacement.to_s)
    -  actor = Ast::Crispr::Replace.call(
    -    content: content.to_s,
    -    target: Ast::Crispr::Selectors.line_block(
    -      start_line_text: open_marker,
    -      end_line_text: close_marker,
    -      include_trailing_gap: true,
    -      limit: {none_or_one: true}
    -    ),
    -    replacement: prepared_replacement,
    -    source_label: "managed text block"
    -  )
    -  return actor.updated_content if actor.match_count.positive?
    +def ruby_static_interpolated_string_value(node)
    +  parts = node.compact_child_nodes.map { |child| ruby_static_string_value(child) }
    +  return if parts.any?(&:nil?)
     
    -  yield
    +  parts.join
     end
    -
    # File 'lib/kettle/jem.rb', line 4329
    +      
    # File 'lib/kettle/jem.rb', line 4813
     
    -def replace_toml_string_scalar_line(content, key, value)
    -  lines = content.to_s.lines
    -  lines.each_with_index do |line, index|
    -    next unless line.strip.start_with?("#{key} ")
    +def ruby_static_string_array_value(node, local_word_arrays = {})
    +  case node
    +  when ::Prism::ArrayNode
    +    return ruby_word_array_names(node) if ruby_word_array_node?(node)
     
    -    indent = line[/\A\s*/]
    -    lines[index] = "#{indent}#{key} = #{JSON.generate(value.to_s)}\n"
    -    return lines.join
    -  end
    -  content
    +    node.elements.map { |element| ruby_static_string_value(element) }
    +  when ::Prism::LocalVariableReadNode
    +    local_word_arrays.fetch(node.name.to_s, [])
    +  else
    +    []
    +  end.compact
     end
    -
    # File 'lib/kettle/jem.rb', line 6876
    +      
    # File 'lib/kettle/jem.rb', line 6774
     
    -def replace_yaml_node_lines(content, key, replacement)
    -  lines = content.to_s.lines
    -  yaml_mapping_nodes(content).each do |mapping|
    -    mapping.children.each_slice(2) do |key_node, value_node|
    -      next unless key_node.is_a?(Psych::Nodes::Scalar) && key_node.value.to_s == key.to_s
    +def ruby_static_string_call_value(node)
    +  return unless node.receiver && node.arguments.nil?
     
    -      start_line = key_node.start_line
    -      end_line = value_node.end_line
    -      return [*lines[0...start_line], replacement, *lines[end_line..].to_a].join
    -    end
    +  value = ruby_static_string_value(node.receiver)
    +  return if value.nil?
    +
    +  case node.name
    +  when :to_s
    +    value.to_s
    +  when :strip
    +    value.strip
    +  when :lstrip
    +    value.lstrip
    +  when :rstrip
    +    value.rstrip
    +  when :chomp
    +    value.chomp
    +  when :chop
    +    value.chop
       end
    -  content
     end
    -
    # File 'lib/kettle/jem.rb', line 6675
    -
    -def replace_yaml_scalar_line(content, key, value)
    -  lines = content.to_s.lines
    -  yaml_scalar_pairs(content).each do |key_node, value_node|
    -    next unless key_node.value.to_s == key.to_s
    -
    -    line_index = key_node.start_line
    -    line = lines[line_index].to_s
    -    key_index = line.index("#{key}:")
    -    next unless key_index
    +      
    # File 'lib/kettle/jem.rb', line 6756
     
    -    lines[line_index] = "#{line[0...key_index]}#{key}: #{value}\n"
    -    return lines.join
    +def ruby_static_string_value(node)
    +  case node
    +  when ::Prism::StringNode
    +    node.unescaped
    +  when ::Prism::InterpolatedStringNode
    +    ruby_static_interpolated_string_value(node)
    +  when ::Prism::CallNode
    +    ruby_static_string_call_value(node)
       end
    -  content
     end
    -
    # File 'lib/kettle/jem.rb', line 6801
    -
    -def replace_yaml_scalar_path(content, path, value)
    -  lines = content.to_s.lines
    -  yaml_scalar_path_entries(content).each do |entry|
    -    next unless entry.fetch(:path) == path
    -
    -    line_index = entry.fetch(:line)
    -    line = lines[line_index].to_s
    -    key = path.last.to_s
    -    key_index = line.index("#{key}:")
    -    next unless key_index
    +      
    # File 'lib/kettle/jem.rb', line 6732
     
    -    lines[line_index] = "#{line[0...key_index]}#{key}: #{value}#{yaml_line_comment_suffix(line, key_index)}\n"
    -    return lines.join
    -  end
    -  content
    +def ruby_string_argument(call)
    +  ruby_string_argument_at(call, 0)
     end
    -
    # File 'lib/kettle/jem.rb', line 8964
    -
    -def repository_facts(project_root, source_url, package_name:, repository_topology:)
    -  topology = normalize_repository_topology(repository_topology)
    -  monorepo_subproject = topology == REPOSITORY_TOPOLOGY_MONOREPO_SUBPROJECT
    -  local_root = monorepo_subproject ? git_worktree_root(project_root) : nil
    -  repo_url = if monorepo_subproject
    -    repository_root_url(git_remote_source_url(local_root || project_root) || source_url)
    -  else
    -    repository_root_url(source_url)
    -  end
    -  repo_name = repository_name_from_source_url(repo_url)
    -  org = github_org_from_url(repo_url).to_s
    -  slug = [org, repo_name].reject(&:empty?).join("/")
    -  facts = compact_hash(
    -    mode: monorepo_subproject ? "monorepo_subproject" : "standalone",
    -    topology: topology,
    -    url: repo_url,
    -    name: repo_name,
    -    slug: slug
    -  )
    -  return facts unless monorepo_subproject
    -
    -  package_path = git_worktree_prefix(project_root)
    -  package_path = package_path[0...-1] while package_path.end_with?("/")
    -  return facts.merge(local_root: local_root) if package_path.empty?
    +      
    # File 'lib/kettle/jem.rb', line 6736
     
    -  facts.merge(
    -    local_root: local_root,
    -    package_path: package_path,
    -    package_source_url: source_tree_url(repo_url, package_path),
    -    gitlab_package_source_url: source_tree_url("https://gitlab.com/#{slug}", package_path),
    -    codeberg_package_source_url: source_tree_url("https://codeberg.org/#{slug}", package_path),
    -    checksums_url: source_tree_url("https://gitlab.com/#{slug}", "checksums")
    -  )
    +def ruby_string_argument_at(call, index)
    +  argument = call&.arguments&.arguments&.[](index)
    +  ruby_static_string_value(argument)
     end
    +
    @@ -46104,9 +62355,9 @@

    -

    +

    - .repository_name_from_source_url(source_url) ⇒ Object + .ruby_style_facts(project_root) ⇒ Object @@ -46118,21 +62369,53 @@

     
     
    -8957
    -8958
    -8959
    -8960
    -8961
    -8962
    +2695 +2696 +2697 +2698 +2699 +2700 +2701 +2702 +2703 +2704 +2705 +2706 +2707 +2708 +2709 +2710 +2711 +2712 +2713 +2714 +2715 +2716

    @@ -46140,9 +62423,9 @@

    -

    +

    - .repository_project_logo_href(repository, slug:, org:, gem_name:) ⇒ Object + .ruby_style_template_tokens(ruby_style) ⇒ Object @@ -46154,21 +62437,59 @@

     
     
    -9398
    -9399
    -9400
    -9401
    -9402
    -9403
    +12275 +12276 +12277 +12278 +12279 +12280 +12281 +12282 +12283 +12284 +12285 +12286 +12287 +12288 +12289 +12290 +12291 +12292 +12293 +12294 +12295 +12296 +12297 +12298 +12299

    @@ -46176,9 +62497,9 @@

    -

    +

    - .repository_project_logo_slug(repository, org:, gem_name:) ⇒ Object + .ruby_template_policy_report(recipe:, request:, original:, final:) ⇒ Object @@ -46190,21 +62511,53 @@

     
     
    -9391
    -9392
    -9393
    -9394
    -9395
    -9396
    +4667 +4668 +4669 +4670 +4671 +4672 +4673 +4674 +4675 +4676 +4677 +4678 +4679 +4680 +4681 +4682 +4683 +4684 +4685 +4686 +4687 +4688

    @@ -46212,147 +62565,60 @@

    -

    +

    - .repository_resource_urls(repository) ⇒ Object + .ruby_top_level_require?(content, method_name, argument) ⇒ Boolean -

     
     
    -9871
    -9872
    -9873
    -9874
    -9875
    -9876
    -9877
    +6741 +6742 +6743 +6744 +6745
    -
    # File 'lib/kettle/jem.rb', line 9871
    -
    -def repository_monorepo_subproject?(repository)
    -  return false unless repository.is_a?(Hash)
    +      
    # File 'lib/kettle/jem.rb', line 6741
     
    -  repository[:topology].to_s == REPOSITORY_TOPOLOGY_MONOREPO_SUBPROJECT ||
    -    repository[:mode].to_s == "monorepo_subproject" ||
    -    repository[:mode].to_s == "monorepo_subgem"
    +def ruby_string_arguments(call)
    +  Array(call&.arguments&.arguments).filter_map do |argument|
    +    ruby_static_string_value(argument)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 8957
    +      
    # File 'lib/kettle/jem.rb', line 2695
     
    -def repository_name_from_source_url(source_url)
    -  base = source_url.to_s.split("?", 2).first.to_s.split("#", 2).first.to_s
    -  base = base[0...-1] while base.end_with?("/")
    -  name = base.split("/").last.to_s
    -  name.end_with?(".git") ? name[0...-4] : name
    +def ruby_style_facts(project_root)
    +  config_path = File.join(project_root.to_s, ".rubocop.yml")
    +  config = if File.file?(config_path)
    +    YAML.safe_load_file(config_path, permitted_classes: [], aliases: true) || {}
    +  else
    +    {}
    +  end
    +  config = {} unless config.is_a?(Hash)
    +  dot_position = config.dig("Layout/DotPosition", "EnforcedStyle").to_s
    +  dot_position = if dot_position == "trailing"
    +    "trailing"
    +  else
    +    "leading"
    +  end
    +
    +  {
    +    dot_position: dot_position,
    +    trailing_array_comma: config.dig("Style/TrailingCommaInArrayLiteral", "EnforcedStyleForMultiline").to_s == "comma"
    +  }
    +rescue Psych::Exception
    +  {dot_position: "leading", trailing_array_comma: false}
     end
    -
    # File 'lib/kettle/jem.rb', line 9398
    +      
    # File 'lib/kettle/jem.rb', line 12275
     
    -def repository_project_logo_href(repository, slug:, org:, gem_name:)
    -  package_source_url = repository.is_a?(Hash) ? repository[:package_source_url].to_s : ""
    -  return package_source_url unless package_source_url.empty?
    +def ruby_style_template_tokens(ruby_style)
    +  style = ruby_style.is_a?(Hash) ? ruby_style : {}
    +  trailing_dot = style.fetch(:dot_position, style["dot_position"]).to_s == "trailing"
    +  trailing_array_comma = style.fetch(:trailing_array_comma, style["trailing_array_comma"]) == true
    +  family_gem_dirs_enumeration = if trailing_dot
    +    <<~RUBY.chomp
    +      Dir.glob(File.join(__dir__, "gems", "*", "*.gemspec")).
    +        map { |path| File.dirname(path) }.
    +        uniq.
    +        sort_by { |path| File.basename(path) }
    +    RUBY
    +  else
    +    <<~RUBY.chomp
    +      Dir.glob(File.join(__dir__, "gems", "*", "*.gemspec"))
    +        .map { |path| File.dirname(path) }
    +        .uniq
    +        .sort_by { |path| File.basename(path) }
    +    RUBY
    +  end
     
    -  (org.to_s.empty? || gem_name.to_s.empty?) ? "#{LOGOS_GALTZO_BASE_URL}/#{slug}/" : "https://github.com/#{org}/#{gem_name}"
    +  {
    +    "KJ|RAKE:FAMILY_GEM_DIRS_ENUMERATION" => family_gem_dirs_enumeration.lines.map { |line| "    #{line}" }.join.chomp,
    +    "KJ|RUBY_STYLE:TRAILING_ARRAY_COMMA" => trailing_array_comma ? "," : ""
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 9391
    +      
    # File 'lib/kettle/jem.rb', line 4667
     
    -def repository_project_logo_slug(repository, org:, gem_name:)
    -  package_path = repository.is_a?(Hash) ? repository[:package_path].to_s : ""
    -  return [org, repository[:name].to_s, File.basename(package_path)].reject(&:empty?).join("/") if repository.is_a?(Hash) && !package_path.empty?
    +def ruby_template_policy_report(recipe:, request:, original:, final:)
    +  return {} unless recipe.fetch(:primitive) == "supplied_template_source_application"
     
    -  [org.to_s, gem_name.to_s].reject(&:empty?).join("/")
    +  file_type = template_file_type(recipe)
    +  return {} unless %i[gemfile gemspec appraisals].include?(file_type)
    +
    +  template_content = request.fetch(:template_content, "")
    +  report = {
    +    policy_kind: "kettle_jem_ruby_template_policy",
    +    file_type: file_type.to_s
    +  }
    +  operations = case file_type
    +  when :gemfile
    +    gemfile_policy_operations(template_content, original, final, request)
    +  when :gemspec
    +    gemspec_policy_operations(template_content, original, final, request)
    +  when :appraisals
    +    appraisals_policy_operations(template_content, original, final, request)
    +  end
    +  report[:operations] = operations
    +  {ruby_template_policy: report}
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    - @@ -46360,9 +62626,9 @@

    -

    +

    - .repository_root_url(source_url) ⇒ Object + .ruby_top_level_require_records(content) ⇒ Object @@ -46374,31 +62640,39 @@

     
     
    -9062
    -9063
    -9064
    -9065
    -9066
    -9067
    -9068
    -9069
    -9070
    -9071
    -9072
    +6660 +6661 +6662 +6663 +6664 +6665 +6666 +6667 +6668 +6669 +6670 +6671 +6672 +6673 +6674

    @@ -46406,9 +62680,9 @@

    -

    +

    - .repository_topology_for(config, env, template_selection) ⇒ Object + .ruby_version_class_eval_namespaces(content) ⇒ Object @@ -46420,25 +62694,27 @@

     
     
    -7201
    -7202
    -7203
    -7204
    -7205
    -7206
    -7207
    -7208
    +11697 +11698 +11699 +11700 +11701 +11702 +11703 +11704 +11705

    @@ -46446,68 +62722,85 @@

    -

    +

    - .resolve_template_tokens(content, tokens, scan_unresolved: true) ⇒ Object + .ruby_version_constant_value(content) ⇒ Object -

    -
    - +

     
     
    -8999
    -9000
    -9001
    -9002
    -9003
    -9004
    -9005
    -9006
    -9007
    -9008
    -9009
    -9010
    -9011
    -9012
    -9013
    -9014
    -9015
    -9016
    -9017
    -9018
    -9019
    -9020
    -9021
    -9022
    -9023
    -9024
    -9025
    -9026
    -9027
    -9028
    -9029
    -9030
    -9031
    -9032
    -9033
    -9034
    -9035
    -9036
    -9037
    -9038
    -9039
    -9040
    -9041
    -9042
    -9043
    -9044
    -9045
    -9046
    -9047
    -9048
    -9049
    -9050
    -9051
    -9052
    -9053
    -9054
    -9055
    -9056
    -9057
    -9058
    -9059
    -9060
    +11575 +11576 +11577 +11578 +11579 +11580 +11581
    -
    # File 'lib/kettle/jem.rb', line 8999
    -
    -def repository_resource_urls(repository)
    -  repo_url = repository[:url].to_s
    -  repo_slug = repository[:slug].to_s
    -  github_org = repo_slug.split("/", 2).first.to_s
    -  repo_name = repository[:name].to_s
    -  gitlab_url = repository[:gitlab_url].to_s
    -  gitlab_url = "https://gitlab.com/#{repo_slug}" if gitlab_url.empty?
    -  codeberg_url = repository[:codeberg_url].to_s
    -  codeberg_url = "https://codeberg.org/#{repo_slug}" if codeberg_url.empty?
    -  package_source_url = repository[:package_source_url].to_s
    -  package_source_url = repo_url if package_source_url.empty?
    -  gitlab_package_source_url = repository[:gitlab_package_source_url].to_s
    -  gitlab_package_source_url = gitlab_url if gitlab_package_source_url.empty?
    -  codeberg_package_source_url = repository[:codeberg_package_source_url].to_s
    -  codeberg_package_source_url = codeberg_url if codeberg_package_source_url.empty?
    -  checksums_url = repository[:checksums_url].to_s
    -  checksums_url = source_tree_url(gitlab_url, "checksums") if checksums_url.empty?
    +    
    +
    # File 'lib/kettle/jem.rb', line 11575
     
    -  {
    -    github_repository_url: repo_url,
    -    github_package_source_url: package_source_url,
    -    github_releases_url: "#{repo_url}/releases",
    -    github_actions_url: "#{repo_url}/actions",
    -    github_discussions_url: "#{repo_url}/discussions",
    -    github_issues_url: "#{repo_url}/issues",
    -    github_pulls_url: "#{repo_url}/pulls",
    -    github_wiki_url: "#{repo_url}/wiki",
    -    github_codeql_url: "#{repo_url}/security/code-scanning",
    -    github_contributors_url: "#{repo_url}/graphs/contributors",
    -    github_contributing_url: source_blob_url(repo_url, "CONTRIBUTING.md"),
    -    github_changelog_url: source_blob_url(repo_url, "CHANGELOG.md"),
    -    github_security_url: source_blob_url(repo_url, "SECURITY.md"),
    -    github_code_of_conduct_url: source_blob_url(repo_url, "CODE_OF_CONDUCT.md"),
    -    github_rubocop_url: source_blob_url(repo_url, "RUBOCOP.md"),
    -    github_irp_url: source_blob_url(repo_url, "IRP.md"),
    -    gitlab_repository_url: gitlab_url,
    -    gitlab_package_source_url: gitlab_package_source_url,
    -    gitlab_issues_url: "#{gitlab_url}/-/issues",
    -    gitlab_pulls_url: "#{gitlab_url}/-/merge_requests",
    -    gitlab_wiki_url: "#{gitlab_url}/-/wikis/home",
    -    gitlab_contributors_url: "#{gitlab_url}/-/graphs/main",
    -    gitlab_contributing_url: source_blob_url(gitlab_url, "CONTRIBUTING.md"),
    -    gitlab_changelog_url: source_blob_url(gitlab_url, "CHANGELOG.md"),
    -    gitlab_code_of_conduct_url: source_blob_url(gitlab_url, "CODE_OF_CONDUCT.md"),
    -    gitlab_compare_url: "#{gitlab_url}/-/compare",
    -    gitlab_tags_url: "#{gitlab_url}/-/tags",
    -    codeberg_repository_url: codeberg_url,
    -    codeberg_package_source_url: codeberg_package_source_url,
    -    codeberg_issues_url: "#{codeberg_url}/issues",
    -    codeberg_pulls_url: "#{codeberg_url}/pulls",
    -    codecov_url: "https://codecov.io/gh/#{repo_slug}",
    -    codecov_badge_url: "https://codecov.io/gh/#{repo_slug}/graph/badge.svg",
    -    codecov_graph_url: "https://codecov.io/gh/#{repo_slug}/graph/badge.svg",
    -    coveralls_url: "https://coveralls.io/github/#{repo_slug}?branch=main",
    -    coveralls_badge_url: "https://coveralls.io/repos/github/#{repo_slug}/badge.svg?branch=main",
    -    qlty_project_url: "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}",
    -    qlty_maintainability_url: "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/maintainability.svg",
    -    qlty_coverage_url: "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/metrics/code?sort=coverageRating",
    -    qlty_coverage_badge_url: "https://qlty.sh/gh/#{github_org}/projects/#{repo_name}/coverage.svg",
    -    checksums_url: checksums_url
    -  }
    +def ruby_top_level_require?(content, method_name, argument)
    +  ensure_runtime_dependencies!
    +  context = Ast::Crispr::Ruby::Prism.document_context(content: content.to_s, source_label: "entrypoint.rb")
    +  context.structural_owners(owner_scope: :top_level_statements).any? do |owner|
    +    ruby_require_call?(owner, method_name, argument)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 9062
    +      
    # File 'lib/kettle/jem.rb', line 6660
     
    -def repository_root_url(source_url)
    -  uri = URI.parse(source_url.to_s)
    -  return source_url.to_s unless uri.host == "github.com"
    +def ruby_top_level_require_records(content)
    +  body = prism_parse_success(content)&.value&.statements&.body || []
    +  body.filter_map do |node|
    +    next unless node.is_a?(::Prism::CallNode) && node.name == :require
     
    -  segments = uri.path.to_s.split("/").reject(&:empty?)
    -  return source_url.to_s if segments.length < 2
    +    name = ruby_string_argument(node)
    +    next unless name
     
    -  "#{uri.scheme}://#{uri.host}/#{segments[0]}/#{segments[1].delete_suffix(".git")}"
    -rescue URI::InvalidURIError
    -  source_url.to_s
    +    {
    +      name: name,
    +      start_line: node.location.start_line,
    +      end_line: ruby_node_source_end_line(node)
    +    }
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 7201
    +      
    # File 'lib/kettle/jem.rb', line 11697
     
    -def repository_topology_for(config, env, template_selection)
    -  repository_config = config["repository"].is_a?(Hash) ? config["repository"] : {}
    -  topology = preferred_template_token_value(nil, repository_config["topology"], env, "KJ_REPOSITORY_TOPOLOGY")
    -  normalized = normalize_repository_topology(topology)
    -  return normalized unless normalized.empty?
    +def ruby_version_class_eval_namespaces(content)
    +  ruby_call_records(content, :class_eval).filter_map do |call|
    +    receiver = call.receiver&.slice.to_s
    +    next unless receiver.end_with?("::Version")
    +    next unless call.block
     
    -  monorepo_subgem_template_profile_value?(template_selection[:template_profile]) ? REPOSITORY_TOPOLOGY_MONOREPO_SUBPROJECT : REPOSITORY_TOPOLOGY_STANDALONE
    +    receiver.delete_suffix("::Version")
    +  end
     end
    + + + + +
    +
     
     
    -  
    +11652
    +11653
    +11654
    +11655
    +11656
    +11657
    +11658
    +11659
    +11660
    +11661
    +11662
    +
    +
    # File 'lib/kettle/jem.rb', line 11652
    +
    +def ruby_version_constant_value(content)
    +  result = prism_parse_success(content)
    +  return unless result
    +
    +  node = result.value.breadth_first_search_all do |candidate|
    +    candidate.is_a?(::Prism::ConstantWriteNode) &&
    +      candidate.name == :VERSION &&
    +      candidate.value.is_a?(::Prism::StringNode)
    +  end.first
    +  node&.value&.unescaped
    +end
    +
    -
    + +
    +

    -

    Raises:

    -
      + .ruby_version_module_namespace(content) ⇒ Object -
    • - - - (ArgumentError) - - - -
    • + -
    -

    + +
    @@ -46515,9 +62808,9 @@

    -

    +

    - .resolve_uncommitted_author!(project_root, author_map) ⇒ Object + .ruby_version_module_namespace_for(node, namespace) ⇒ Object @@ -46529,34 +62822,36 @@

     
     
    -8330
    -8331
    -8332
    -8333
    -8334
    -8335
    -8336
    -8337
    -8338
    -8339
    -8340
    -8341
    -8342
    +11673 +11674 +11675 +11676 +11677 +11678 +11679 +11680 +11681 +11682 +11683 +11684 +11685 +11686

    @@ -46565,9 +62860,9 @@

    -

    +

    - .resolved_licenses(config, gemspec_licenses) ⇒ Object + .ruby_word_array_names(node) ⇒ Object @@ -46579,25 +62874,19 @@

     
     
    -9529
    -9530
    -9531
    -9532
    -9533
    -9534
    -9535
    -9536
    +6854 +6855 +6856 +6857 +6858

    @@ -46605,9 +62894,9 @@

    -

    +

    - .retired_gemspec_development_dependency_key?(key) ⇒ Boolean + .ruby_word_array_node?(node) ⇒ Boolean @@ -46642,77 +62931,15 @@

    -6471 -6472 -6473 -6474 - -

    - -
     
     
    -9799
    -9800
    -9801
    -9802
    -9803
    -9804
    -9805
    -9806
    -9807
    -9808
    -9809
    +11664 +11665 +11666 +11667 +11668 +11669 +11670 +11671
    -
    # File 'lib/kettle/jem.rb', line 9799
    -
    -def resolve_template_tokens(content, tokens, scan_unresolved: true)
    -  resolver = Token::Resolver::Resolve.new(on_missing: :keep)
    -  document = Token::Resolver::Document.new(content.to_s, config: TEMPLATE_TOKEN_CONFIG)
    -  resolved = resolver.resolve(document, stringify_template_tokens(tokens))
    -  return resolved unless scan_unresolved
    +      
    # File 'lib/kettle/jem.rb', line 11664
     
    -  unresolved = Token::Resolver::Document.new(resolved, config: TEMPLATE_TOKEN_CONFIG).token_keys.grep(/\AKJ\|/).sort
    -  return resolved if unresolved.empty?
    -
    -  raise ArgumentError, "unresolved kettle-jem template tokens: #{unresolved.map { |token| "{#{token}}" }.join(", ")}"
    +def ruby_version_module_namespace(content)
    +  body = prism_parse_success(content)&.value&.statements&.body || []
    +  body.each do |node|
    +    namespace = ruby_version_module_namespace_for(node, [])
    +    return namespace if namespace
    +  end
    +  nil
     end
    -
    # File 'lib/kettle/jem.rb', line 8330
    +      
    # File 'lib/kettle/jem.rb', line 11673
     
    -def resolve_uncommitted_author!(project_root, author_map)
    -  uncommitted = author_map.delete(NOT_COMMITTED_EMAIL)
    -  return unless uncommitted && !uncommitted[:years].empty?
    +def ruby_version_module_namespace_for(node, namespace)
    +  return unless node.is_a?(::Prism::ModuleNode)
     
    -  name = git_capture(project_root, "config", "user.name").strip
    -  email = git_capture(project_root, "config", "user.email").strip
    -  return if email.empty?
    +  current = namespace + ruby_constant_path_segments(node.constant_path)
    +  if current.last == "Version" && current.length > 1
    +    return current[0...-1].join("::")
    +  end
     
    -  author_map[email][:name] ||= name
    -  author_map[email][:years].concat(uncommitted[:years])
    -rescue ArgumentError
    +  node.body&.body&.each do |child|
    +    child_namespace = ruby_version_module_namespace_for(child, current)
    +    return child_namespace if child_namespace
    +  end
       nil
     end
    -
    # File 'lib/kettle/jem.rb', line 9529
    -
    -def resolved_licenses(config, gemspec_licenses)
    -  config_licenses = config.is_a?(Hash) ? config["licenses"] : nil
    -  licenses = Array(config_licenses).map { |license| license.to_s.strip }.reject(&:empty?)
    -  return licenses unless licenses.empty?
    +      
    # File 'lib/kettle/jem.rb', line 6854
     
    -  licenses = Array(gemspec_licenses).map { |license| license.to_s.strip }.reject(&:empty?)
    -  licenses.empty? ? ["MIT"] : licenses
    +def ruby_word_array_names(node)
    +  node.elements.filter_map do |element|
    +    element.unescaped if element.is_a?(::Prism::StringNode)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 6471
    -
    -def retired_gemspec_development_dependency_key?(key)
    -  key.first == "add_development_dependency" &&
    -    RETIRED_GEMSPEC_DEVELOPMENT_DEPENDENCIES.include?(key.last)
    -end
    -
    -
    - -
    -

    - - .rewrite_gemspec_version_loader(content, facts:) ⇒ Object - - - - - -

    - - @@ -46720,9 +62947,9 @@

    -

    - .rewrite_markdown_reference_links(content, links) ⇒ Object + .ruby_word_array_nodes(content) ⇒ Object @@ -46734,34 +62961,24 @@

    @@ -46770,9 +62987,9 @@ @@ -46812,9 +63037,9 @@

    -

    +

    - .rubocop_template_tokens(min_ruby) ⇒ Object + .run_apply_phases(project_root, report) ⇒ Object @@ -46826,27 +63051,111 @@

     
     
    -9461
    -9462
    -9463
    -9464
    -9465
    -9466
    -9467
    -9468
    -9469
    +10035 +10036 +10037 +10038 +10039 +10040 +10041 +10042 +10043 +10044 +10045 +10046 +10047 +10048 +10049 +10050 +10051 +10052 +10053 +10054 +10055 +10056 +10057 +10058 +10059 +10060 +10061 +10062 +10063 +10064 +10065 +10066 +10067 +10068 +10069 +10070 +10071 +10072 +10073 +10074 +10075 +10076 +10077 +10078 +10079 +10080 +10081 +10082 +10083 +10084 +10085

    @@ -46854,9 +63163,9 @@

    -

    +

    - .rubocop_tokens_for(min_ruby) ⇒ Object + .runtime_context_value(request, *path) ⇒ Object @@ -46868,33 +63177,25 @@

     
     
    -9481
    -9482
    -9483
    -9484
    -9485
    -9486
    -9487
    -9488
    -9489
    -9490
    -9491
    -9492
    +4782 +4783 +4784 +4785 +4786 +4787 +4788 +4789

    @@ -46902,9 +63203,9 @@

    -

    +

    - .ruby_appraisal_name_version(name) ⇒ Object + .runtime_gemspec_dependency_insertion_index(lines, receiver:) ⇒ Object @@ -46916,29 +63217,31 @@

     
     
    -5921
    -5922
    -5923
    -5924
    -5925
    -5926
    -5927
    -5928
    -5929
    -5930
    +8538 +8539 +8540 +8541 +8542 +8543 +8544 +8545 +8546 +8547 +8548

    @@ -46946,9 +63249,9 @@

    -

    +

    - .ruby_appraisal_names_below(content, min_ruby) ⇒ Object + .runtime_workspace_override_records(content) ⇒ Object @@ -46960,31 +63263,47 @@

     
     
    -4137
    -4138
    -4139
    -4140
    -4141
    -4142
    -4143
    -4144
    -4145
    -4146
    -4147
    +6075 +6076 +6077 +6078 +6079 +6080 +6081 +6082 +6083 +6084 +6085 +6086 +6087 +6088 +6089 +6090 +6091 +6092 +6093

    @@ -46992,9 +63311,9 @@

    -

    +

    - .ruby_array_literal(values) ⇒ Object + .security_supported_version_token(version) ⇒ Object @@ -47006,15 +63325,29 @@

     
     
    -8255
    -8256
    -8257
    +10586 +10587 +10588 +10589 +10590 +10591 +10592 +10593 +10594 +10595

    @@ -47022,9 +63355,9 @@

    -

    +

    - .ruby_bucket_path_segment?(segment) ⇒ Boolean + .selected_template_path?(relative_path, patterns) ⇒ Boolean @@ -47059,64 +63392,26 @@

     
     
    -5567
    -5568
    -5569
    -5570
    -5571
    -5572
    -5573
    -5574
    - -

    - -
    -
    -
    -
    -5960
    -5961
    -5962
    -5963
    -5964
    -5965
    -5966
    -5967
    -5968
    -5969
    -5970
    -5971
    -5972
    -5973
    -5974
    -5975
    -5976
    -5977
    +6850 +6851 +6852
    -
    # File 'lib/kettle/jem.rb', line 5960
    -
    -def rewrite_gemspec_version_loader(content, facts:)
    -  min_ruby = gemspec_runtime_floor_token(facts)
    -  return content if min_ruby.to_s.empty?
    -
    -  namespace = facts.to_h.dig(:rubygems, :namespace).to_s
    -  entrypoint_require = facts.to_h.dig(:rubygems, :entrypoint_require).to_s
    -  entrypoint_require = facts.to_h.dig(:package, :name).to_s.tr("-", "/") if entrypoint_require.empty?
    -  return content if namespace.empty? || entrypoint_require.empty?
    +      
    # File 'lib/kettle/jem.rb', line 6850
     
    -  receiver = gemspec_block_param(content) || "spec"
    -  min_ruby_version = Gem::Version.new(min_ruby)
    -  modern = min_ruby_version >= MODERN_GEMSPEC_VERSION_LOADER_MIN_RUBY
    -  rhs = modern ? gemspec_modern_version_loader_expression(entrypoint_require: entrypoint_require, namespace: namespace) : "gem_version"
    -  rewritten = replace_gemspec_version_assignment(content, receiver: receiver, rhs: rhs)
    -  modern ? remove_gemspec_legacy_version_loader_preamble(rewritten) : ensure_gemspec_legacy_version_loader_preamble(rewritten, entrypoint_require: entrypoint_require, namespace: namespace, min_ruby: min_ruby_version)
    -rescue ArgumentError, Ast::Crispr::Error
    -  content
    +def ruby_word_array_node?(node)
    +  node.is_a?(::Prism::ArrayNode) && node.opening_loc&.slice.to_s.start_with?("%w[")
     end
    -
    # File 'lib/kettle/jem.rb', line 4574
    +      
    # File 'lib/kettle/jem.rb', line 6841
     
    -def rewrite_markdown_reference_links(content, links)
    -  context = Ast::Crispr::Markdown::Markly.document_context(content: content, source_label: "README.md")
    -  context.structural_owners(owner_scope: :link_definitions).reduce(content.to_s) do |processed, owner|
    -    replacement = links[owner.url.to_s]
    -    next processed unless replacement
    +def ruby_word_array_nodes(content)
    +  result = prism_parse_success(content)
    +  return [] unless result
     
    -    replace_markdown_with_ast_crispr(
    -      processed,
    -      Ast::Crispr::Markdown::Markly::Selectors.link_definition(label: owner.label, limit: {exactly: 1}),
    -      markdown_link_definition_source(owner, replacement)
    -    )
    +  result.value.breadth_first_search_all do |node|
    +    ruby_word_array_node?(node)
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 9471
    +      
    # File 'lib/kettle/jem.rb', line 6827
     
    -def rubocop_target_ruby_token(min_ruby)
    -  token = minimum_ruby_token(min_ruby)
    -  return "0" if token == "0"
    -
    -  segments = Gem::Version.new(token).segments
    -  segments.first(2).join(".")
    -rescue ArgumentError
    -  ""
    +def ruby_word_array_records(content)
    +  ruby_word_array_nodes(content).map do |node|
    +    {
    +      names: ruby_word_array_names(node),
    +      source: node.location.slice,
    +      start_line: node.location.start_line,
    +      end_line: node.location.end_line,
    +      start_column: node.location.start_column,
    +      start_offset: node.location.start_offset,
    +      end_offset: node.location.end_offset
    +    }
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 9461
    +      
    # File 'lib/kettle/jem.rb', line 10035
     
    -def rubocop_template_tokens(min_ruby)
    -  constraint, gem_name, gem_constraint = rubocop_tokens_for(min_ruby_version(min_ruby))
    -  {
    -    "KJ|RUBOCOP_TARGET_RUBY" => rubocop_target_ruby_token(min_ruby),
    -    "KJ|RUBOCOP_LTS_CONSTRAINT" => constraint,
    -    "KJ|RUBOCOP_RUBY_GEM" => gem_name,
    -    "KJ|RUBOCOP_RUBY_CONSTRAINT" => gem_constraint
    -  }
    +def run_apply_phases(project_root, report)
    +  plugin_registry = plugin_registry_for_project(project_root)
    +  changed_files = report.fetch(:changed_files)
    +  diagnostics = report.fetch(:diagnostics)
    +  context = PluginContext.new(
    +    project_root: project_root,
    +    mode: "apply",
    +    facts: report.fetch(:facts),
    +    recipe_pack: report.fetch(:recipe_pack),
    +    recipe_reports: report.fetch(:recipe_reports),
    +    phase_reports: report.fetch(:phase_reports),
    +    changed_files: changed_files,
    +    diagnostics: diagnostics
    +  )
    +  reports_by_phase = report.fetch(:recipe_reports).group_by { |recipe_report| recipe_report_phase(recipe_report) }
    +  active_runner_phases = report.fetch(:phase_reports).map { |phase_report| phase_report.fetch(:phase).to_sym }
    +  active_runner_phases.each do |phase|
    +    phase_report = report.fetch(:phase_reports).find { |entry| entry.fetch(:phase).to_sym == phase }
    +    phase_stats = phase_report.fetch(:stats)
    +    unless plugin_registry.empty?
    +      plugin_registry.run(
    +        timing: :before,
    +        phase: phase,
    +        context: context,
    +        actor: self,
    +        phase_stats: phase_stats
    +      )
    +    end
    +    reports_by_phase.fetch(phase, []).each do |recipe_report|
    +      apply_recipe_report(project_root, recipe_report)
    +    end
    +    unless plugin_registry.empty?
    +      plugin_registry.run(
    +        timing: :after,
    +        phase: phase,
    +        context: context,
    +        actor: self,
    +        phase_stats: phase_stats
    +      )
    +    end
    +  end
    +  unless plugin_registry.configured_plugins.empty?
    +    diagnostics << plugin_lifecycle_diagnostic(
    +      plugin_registry,
    +      callbacks_run: true,
    +      active_runner_phases: active_runner_phases
    +    )
    +  end
    +  changed_files.sort!
    +  report[:run_stats] = recipe_run_stats(report.fetch(:recipe_reports), diagnostics: diagnostics)
     end
    -
    # File 'lib/kettle/jem.rb', line 9481
    +      
    # File 'lib/kettle/jem.rb', line 4782
     
    -def rubocop_tokens_for(min_ruby)
    -  fallback = RUBOCOP_VERSION_MAP.first
    -  selected = nil
    -  RUBOCOP_VERSION_MAP.reverse_each do |minimum, lts_constraint, ruby_gem, ruby_constraint|
    -    next unless min_ruby && min_ruby >= minimum
    +def runtime_context_value(request, *path)
    +  context = request[:runtime_context] || request["runtime_context"] || {}
    +  path.reduce(context) do |value, key|
    +    break nil unless value.respond_to?(:[])
     
    -    selected = [minimum, lts_constraint, ruby_gem, ruby_constraint]
    -    break
    +    value[key] || value[key.to_s]
       end
    -  selected ||= fallback
    -  [selected[1], selected[2], selected[3]]
     end
    -
    # File 'lib/kettle/jem.rb', line 5921
    +      
    # File 'lib/kettle/jem.rb', line 8538
     
    -def ruby_appraisal_name_version(name)
    -  text = name.to_s
    -  return unless text.start_with?("ruby-")
    +def runtime_gemspec_dependency_insertion_index(lines, receiver:)
    +  note_index = lines.find_index { |line| line.lstrip.start_with?("# NOTE: It is preferable to list development dependencies") }
    +  return note_index - 1 if note_index&.positive? && lines[note_index - 1].strip.empty?
    +  return note_index if note_index
     
    -  major, minor, extra = text.delete_prefix("ruby-").split("-", -1)
    -  return if extra || major.to_s.empty? || minor.to_s.empty?
    -  return unless [major, minor].all? { |part| part.each_char.all? { |char| char.between?("0", "9") } }
    +  development_line = gemspec_dependency_records(lines.join, receiver: receiver).find { |record| record.fetch(:kind) == "add_development_dependency" }&.fetch(:start_line)
    +  development_index = development_line && development_line - 1
    +  return development_index if development_index
     
    -  Gem::Version.new("#{major}.#{minor}")
    +  gemspec_end_line(lines.join) - 1
     end
    -
    # File 'lib/kettle/jem.rb', line 4137
    +      
    # File 'lib/kettle/jem.rb', line 6075
     
    -def ruby_appraisal_names_below(content, min_ruby)
    -  return [] if min_ruby.to_s.empty?
    +def runtime_workspace_override_records(content)
    +  result = prism_parse_success(content)
    +  return [] unless result
     
    -  minimum = Gem::Version.new(min_ruby.to_s)
    -  appraisal_names(content).select do |name|
    -    version = ruby_appraisal_name_version(name)
    -    version && version < minimum
    +  conditional_nodes = result.value.breadth_first_search_all do |node|
    +    gemfile_conditional_node?(node)
    +  end
    +  templating_guard_ranges = conditional_nodes.filter_map do |node|
    +    next unless prism_subtree_contains_string?(node, "K_JEM_TEMPLATING")
    +
    +    {start_line: node.location.start_line, end_line: node.location.end_line}
    +  end
    +  conditional_nodes.select do |node|
    +    gemfile_workspace_override_node?(node) &&
    +      !node_enclosed_by_ranges?(node, templating_guard_ranges)
    +  end.map do |node|
    +    {start_line: node.location.start_line, end_line: node.location.end_line}
       end
    -rescue ArgumentError
    -  []
     end
    -
    # File 'lib/kettle/jem.rb', line 8255
    +      
    # File 'lib/kettle/jem.rb', line 10586
     
    -def ruby_array_literal(values)
    -  "[#{Array(values).map { |value| %("#{ruby_double_quoted_string_body(value.to_s)}") }.join(", ")}]"
    +def security_supported_version_token(version)
    +  parsed = Gem::Version.new(version.to_s)
    +  major = parsed.segments.fetch(0, 0).to_i
    +  return "0.latest" if major.zero?
    +
    +  minor = parsed.segments.fetch(1, 0).to_i
    +  "#{major}.#{minor}.latest"
    +rescue ArgumentError
    +  "0.latest"
     end
    -
    # File 'lib/kettle/jem.rb', line 5567
    -
    -def ruby_bucket_path_segment?(segment)
    -  return false unless segment.to_s.start_with?("r")
    -
    -  version = segment.to_s[1..].to_s
    -  return false if version.empty?
    -
    -  version.split(".", -1).all? { |part| !part.empty? && part.each_char.all? { |char| char.between?("0", "9") } }
    -end
    -
    -
    - -
    -

    - - .ruby_call_records(content, call_name) ⇒ Object - - - - - -

    - - @@ -47125,9 +63420,9 @@

    -

    +

    - .ruby_constant_path_segments(node) ⇒ Object + .semantic_readme_heading(text) ⇒ Object @@ -47139,15 +63434,15 @@

     
     
    -8911
    -8912
    -8913
    +13124 +13125 +13126

    @@ -47155,9 +63450,9 @@

    -

    +

    - .ruby_double_quoted_string_body(value) ⇒ Object + .set_template_file_strategy!(config, target_path, strategy) ⇒ Object @@ -47169,15 +63464,27 @@

     
     
    -7147
    -7148
    -7149
    +13174 +13175 +13176 +13177 +13178 +13179 +13180 +13181 +13182

    @@ -47185,9 +63492,9 @@

    -

    +

    - .ruby_engines_config(config) ⇒ Object + .setup_execution_context(env, run_options) ⇒ Object @@ -47199,21 +63506,29 @@

     
     
    -7412
    -7413
    -7414
    -7415
    -7416
    -7417
    +9617 +9618 +9619 +9620 +9621 +9622 +9623 +9624 +9625 +9626

    @@ -47221,9 +63536,9 @@

    -

    +

    - .ruby_first_string_argument(owner) ⇒ Object + .setup_guidance_diagnostic(config_existed:) ⇒ Object @@ -47235,17 +63550,29 @@

     
     
    -8824
    -8825
    -8826
    -8827
    +9606 +9607 +9608 +9609 +9610 +9611 +9612 +9613 +9614 +9615

    @@ -47253,9 +63580,9 @@

    -

    +

    - .ruby_keyword_string_argument(call, key) ⇒ Object + .setup_project(project_root, env: ENV, run_options: {}, command_runner: nil) ⇒ Object @@ -47267,97 +63594,71 @@

     
     
    -5414
    -5415
    -5416
    -5417
    -5418
    -5419
    -5420
    -5421
    - -

    - -
    -
    -
    -
    -5354
    -5355
    -5356
    -5357
    -5358
    -5359
    -5360
    -5361
    +9556 +9557 +9558 +9559 +9560 +9561 +9562 +9563 +9564
    -
    # File 'lib/kettle/jem.rb', line 5354
    -
    -def ruby_call_records(content, call_name)
    -  result = prism_parse_success(content)
    -  return [] unless result
    +      
    # File 'lib/kettle/jem.rb', line 9556
     
    -  result.value.breadth_first_search_all do |node|
    -    node.is_a?(::Prism::CallNode) && (call_name.nil? || node.name == call_name)
    +def selected_template_path?(relative_path, patterns)
    +  path = relative_path.to_s.delete_prefix("./")
    +  patterns.any? do |pattern|
    +    normalized = pattern.to_s.delete_prefix("./")
    +    path == normalized ||
    +      File.fnmatch?(normalized, path, File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB) ||
    +      (normalized.end_with?("/**") && path.start_with?(normalized.delete_suffix("/**") + "/"))
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 8911
    +      
    # File 'lib/kettle/jem.rb', line 13124
     
    -def ruby_constant_path_segments(node)
    -  node&.slice.to_s.split("::").reject(&:empty?)
    +def semantic_readme_heading(text)
    +  normalize_readme_heading(text)
     end
    -
    # File 'lib/kettle/jem.rb', line 7147
    +      
    # File 'lib/kettle/jem.rb', line 13174
     
    -def ruby_double_quoted_string_body(value)
    -  value.to_s.gsub("\\", "\\\\\\").gsub('"', '\"')
    +def set_template_file_strategy!(config, target_path, strategy)
    +  config["files"] = {} unless config["files"].is_a?(Hash)
    +  current = config["files"]
    +  target_path.to_s.split("/").each do |part|
    +    current[part] = {} unless current[part].is_a?(Hash)
    +    current = current[part]
    +  end
    +  current["strategy"] = strategy
     end
    -
    # File 'lib/kettle/jem.rb', line 7412
    +      
    # File 'lib/kettle/jem.rb', line 9617
     
    -def ruby_engines_config(config)
    -  engines = config["engines"]
    -  return unless engines.is_a?(Array)
    +def setup_execution_context(env, run_options)
    +  return {bundled: false, source: "bootstrap_mode", bundle_gemfile: nil} if DecisionPolicy.value_to_boolean((run_options || {})[:bootstrap_mode])
     
    -  engines.map { |engine| engine.to_s.strip.downcase }.reject(&:empty?).uniq
    +  bundle_gemfile = (env || {})["BUNDLE_GEMFILE"].to_s.strip
    +  {
    +    bundled: !bundle_gemfile.empty?,
    +    source: bundle_gemfile.empty? ? "process" : "BUNDLE_GEMFILE",
    +    bundle_gemfile: bundle_gemfile.empty? ? nil : bundle_gemfile
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 8824
    +      
    # File 'lib/kettle/jem.rb', line 9606
     
    -def ruby_first_string_argument(owner)
    -  argument = owner.arguments&.arguments&.first
    -  argument.respond_to?(:unescaped) ? argument.unescaped : nil
    +def setup_guidance_diagnostic(config_existed:)
    +  {
    +    severity: "advisory",
    +    message: if config_existed
    +               "Kettle/Jem setup bootstrap mode found existing #{KETTLE_CONFIG_PATH}; run kettle-jem apply to template the project."
    +             else
    +               "Created #{KETTLE_CONFIG_PATH}. Review it, then run kettle-jem --accept-config to continue setup."
    +             end
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 5414
    -
    -def ruby_keyword_string_argument(call, key)
    -  keyword_hash = Array(call&.arguments&.arguments).find { |argument| argument.is_a?(::Prism::KeywordHashNode) }
    -  assoc = keyword_hash&.elements&.find do |element|
    -    element.respond_to?(:key) && element.key.respond_to?(:unescaped) && element.key.unescaped == key.to_s
    -  end
    -  value = assoc&.value
    -  value.unescaped if value.is_a?(::Prism::StringNode)
    -end
    +3999 +4000 +4001 +4002 +4003 +4004 +4005 +4006 +4007 +4008 +4009 +4010 +4011 +4012 +4013 +4014 +4015 +4016 +4017 +4018 +4019 +4020 +4021 +4022 +4023 +4024 +4025 +4026 +4027 +4028 +4029
    -
    - -
    -

    - - .ruby_merge_options(recipe, merge_template_requires:) ⇒ Object - - - - - -

    - - - -
    -
    -
    +      
    # File 'lib/kettle/jem.rb', line 3999
     
    -5101
    -5102
    -5103
    -5104
    -5105
    -5106
    -5107
    -5108
    -
    -
    # File 'lib/kettle/jem.rb', line 5101
    +def setup_project(project_root, env: ENV, run_options: {}, command_runner: nil)
    +  root = File.expand_path(project_root.to_s)
    +  config_path = kettle_jem_config_path(root)
    +  config_existed = File.exist?(config_path)
    +  execution_context = setup_execution_context(env, run_options)
    +  plan = plan_project(root, env: env, run_options: run_options)
    +  selection = plan.fetch(:template_selection)
    +  bootstrap_only = selection[:bootstrap_mode] || (!config_existed && !selection[:accept_config])
     
    -def ruby_merge_options(recipe, merge_template_requires:)
    -  options = {merge_template_requires: merge_template_requires}
    -  parameters = Ruby::Merge.method(:merge_ruby).parameters
    -  if parameters.include?([:key, :method_move_policy]) || parameters.any? { |kind, _name| kind == :keyrest }
    -    options[:method_move_policy] = ruby_method_move_policy(recipe)
    +  if bootstrap_only
    +    bootstrap_report = plan.fetch(:recipe_reports).find { |report| report.fetch(:relative_path) == KETTLE_CONFIG_PATH }
    +    apply_recipe_report(root, bootstrap_report) if bootstrap_report&.fetch(:changed, false)
    +    changed_files = bootstrap_report&.fetch(:changed, false) ? [KETTLE_CONFIG_PATH] : []
    +    return plan.merge(
    +      mode: "setup",
    +      setup_status: config_existed ? "bootstrap_config_already_present" : "bootstrap_config_written",
    +      setup_execution_context: execution_context,
    +      ready: config_existed,
    +      changed_files: changed_files,
    +      diagnostics: plan.fetch(:diagnostics) + [setup_guidance_diagnostic(config_existed: config_existed)]
    +    )
       end
    -  options
    -end
    -
    -
    - -
    -

    - - .ruby_method_move_policy(recipe) ⇒ Object - - - - - -

    - - - @@ -47365,9 +63666,9 @@

    -

    +

    - .ruby_multiline_word_array_source(names, indent:) ⇒ Object + .shield_token(value) ⇒ Object @@ -47379,19 +63680,15 @@

     
     
    -5486
    -5487
    -5488
    -5489
    -5490
    +11742 +11743 +11744

    @@ -47399,9 +63696,9 @@

    -

    +

    - .ruby_require_aliases(recipe, facts = nil) ⇒ Object + .shim_facts(config, env, run_options, package_name:, entrypoint_require:, template_profile:) ⇒ Object @@ -47413,90 +63710,85 @@

     
     
    -5143
    -5144
    -5145
    -5146
    -5147
    -5148
    -5149
    -5150
    -5151
    -5152
    -5153
    -5154
    - -

    - -
    -
    -
     
    -5067
    -5068
    -5069
    -5070
    -
    -
    # File 'lib/kettle/jem.rb', line 5067
    -
    -def ruby_method_move_policy(recipe)
    -  recipe.dig(:template_preference, :method_move_policy) ||
    -    (Ruby::Merge.const_defined?(:DEFAULT_METHOD_MOVE_POLICY) ? Ruby::Merge::DEFAULT_METHOD_MOVE_POLICY : DEFAULT_RUBY_METHOD_MOVE_POLICY)
    +  install_kwargs = {project_root: root, env: env, run_options: run_options}
    +  install_kwargs[:command_runner] = command_runner if command_runner
    +  Tasks::InstallTask.run(**install_kwargs).merge(
    +    mode: "setup",
    +    setup_execution_context: execution_context,
    +    setup_status: config_existed ? "configured_project_applied" : "accepted_config_applied"
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 5486
    +      
    # File 'lib/kettle/jem.rb', line 11742
     
    -def ruby_multiline_word_array_source(names, indent:)
    -  prefix = " " * indent.to_i
    -  element_prefix = "#{prefix}  "
    -  (["#{prefix}%w["] + names.map { |name| "#{element_prefix}#{name}" } + ["#{prefix}]"]).join("\n")
    +def shield_token(value)
    +  value.to_s.gsub("-", "--").gsub("_", "__").tr(" ", "_")
     end
    -
    # File 'lib/kettle/jem.rb', line 5143
    -
    -def ruby_require_aliases(recipe, facts = nil)
    -  facts ||= recipe[:facts] || recipe["facts"]
    -  return [] unless facts.is_a?(Hash)
    -
    -  package = facts[:package] || facts["package"] || {}
    -  rubygems = facts[:rubygems] || facts["rubygems"] || {}
    -  package_name = (package[:name] || package["name"]).to_s.strip
    -  entrypoint = (rubygems[:entrypoint_require] || rubygems["entrypoint_require"]).to_s.strip
    -  return [] if package_name.empty? || entrypoint.empty? || package_name == entrypoint
    -
    -  [[package_name, entrypoint]]
    -end
    -
    -
    - -
    -

    - - .ruby_require_call?(owner, method_name, argument) ⇒ Boolean - - - - - -

    -
    - - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Boolean) - - - -
    • - -
    - -
    - - @@ -47504,9 +63796,9 @@

    -

    +

    - .ruby_string_argument(call) ⇒ Object + .shim_profile_cleanups(project_root, facts, preferences, template_selection: {}) ⇒ Object @@ -47518,15 +63810,45 @@

     
     
    -5399
    -5400
    -5401
    +13296 +13297 +13298 +13299 +13300 +13301 +13302 +13303 +13304 +13305 +13306 +13307 +13308 +13309 +13310 +13311 +13312 +13313

    @@ -47534,9 +63856,9 @@

    -

    +

    - .ruby_string_argument_at(call, index) ⇒ Object + .shim_replacement_namespace(replacement_require) ⇒ Object @@ -47548,17 +63870,23 @@

     
     
    -5403
    -5404
    -5405
    -5406
    +10528 +10529 +10530 +10531 +10532 +10533 +10534

    @@ -47566,9 +63894,9 @@

    -

    +

    - .ruby_string_arguments(call) ⇒ Object + .shim_template_entries(facts, config) ⇒ Object @@ -47580,19 +63908,41 @@

     
     
    -5408
    -5409
    -5410
    -5411
    -5412
    +13204 +13205 +13206 +13207 +13208 +13209 +13210 +13211 +13212 +13213 +13214 +13215 +13216 +13217 +13218 +13219

    @@ -47600,9 +63950,9 @@

    -

    +

    - .ruby_template_policy_report(recipe:, request:, original:, final:) ⇒ Object + .shim_template_entries_for_config(gemspec_path, config) ⇒ Object @@ -47614,53 +63964,43 @@

     
     
    -4005
    -4006
    -4007
    -4008
    -4009
    -4010
    -4011
    -4012
    -4013
    -4014
    -4015
    -4016
    -4017
    -4018
    -4019
    -4020
    -4021
    -4022
    -4023
    -4024
    -4025
    -4026
    +9352 +9353 +9354 +9355 +9356 +9357 +9358 +9359 +9360 +9361 +9362 +9363 +9364 +9365 +9366 +9367 +9368

    @@ -47668,9 +64008,9 @@

    -

    +

    - .ruby_top_level_require?(content, method_name, argument) ⇒ Boolean + .shim_template_profile?(facts) ⇒ Boolean @@ -47705,21 +64045,15 @@

     
     
    -8811
    -8812
    -8813
    -8814
    -8815
    -8816
    +9411 +9412 +9413

    @@ -47727,9 +64061,9 @@

    -

    +

    - .ruby_top_level_require_records(content) ⇒ Object + .shim_template_tokens(shim) ⇒ Object @@ -47741,39 +64075,27 @@

     
     
    -5338
    -5339
    -5340
    -5341
    -5342
    -5343
    -5344
    -5345
    -5346
    -5347
    -5348
    -5349
    -5350
    -5351
    -5352
    +10391 +10392 +10393 +10394 +10395 +10396 +10397 +10398 +10399

    @@ -47781,9 +64103,9 @@

    -

    +

    - .ruby_version_class_eval_namespaces(content) ⇒ Object + .shim_version_file_content(namespace:, replacement_namespace:, replacement_require:) ⇒ Object @@ -47795,26 +64117,107 @@

     
     
    -8919
    -8920
    -8921
    -8922
    -8923
    -8924
    -8925
    -8926
    -8927
    +10536 +10537 +10538 +10539 +10540 +10541 +10542 +10543 +10544 +10545 +10546 +10547 +10548 +10549

    + +
    -
    -
    -
    -8818
    -8819
    -8820
    -8821
    -8822
    +3255 +3256 +3257 +3258 +3259 +3260 +3261 +3262 +3263 +3264 +3265 +3266 +3267 +3268 +3269 +3270 +3271 +3272 +3273 +3274 +3275 +3276 +3277 +3278 +3279 +3280 +3281 +3282 +3283 +3284 +3285 +3286 +3287 +3288 +3289 +3290 +3291 +3292
    -
    # File 'lib/kettle/jem.rb', line 8818
    +      
    # File 'lib/kettle/jem.rb', line 3255
    +
    +def shim_facts(config, env, run_options, package_name:, entrypoint_require:, template_profile:)
    +  shim_config = config["shim"].is_a?(Hash) ? config["shim"] : {}
    +  selection = run_options || {}
    +  replacement_gem = selection[:shimmed_gem].to_s.strip
    +  replacement_gem = selection["shimmed_gem"].to_s.strip if replacement_gem.empty?
    +  replacement_gem = env["KETTLE_JEM_SHIMMED_GEM"].to_s.strip if replacement_gem.empty?
    +  replacement_gem = shim_config["replacement_gem"].to_s.strip if replacement_gem.empty?
    +
    +  replacement_require = selection[:shimmed_require].to_s.strip
    +  replacement_require = selection["shimmed_require"].to_s.strip if replacement_require.empty?
    +  replacement_require = env["KETTLE_JEM_SHIMMED_REQUIRE"].to_s.strip if replacement_require.empty?
    +  replacement_require = shim_config["replacement_require"].to_s.strip if replacement_require.empty?
    +  replacement_require = replacement_gem if replacement_require.empty?
    +  replacement_git = env["KETTLE_JEM_SHIMMED_GIT"].to_s.strip
    +  replacement_git = shim_config["replacement_git"].to_s.strip if replacement_git.empty?
    +
    +  legacy_requires = Array(shim_config["legacy_requires"]).flat_map { |entry| entry.to_s.split(",") }
    +  env_legacy_requires = env["KETTLE_JEM_SHIM_LEGACY_REQUIRES"].to_s
    +  legacy_requires.concat(env_legacy_requires.split(",")) unless env_legacy_requires.empty?
    +  legacy_requires << entrypoint_require
    +  legacy_requires = legacy_requires.map(&:strip).reject(&:empty?).uniq
    +
    +  return {} if replacement_gem.empty? && template_profile.to_s != SHIM_TEMPLATE_PROFILE
    +  if replacement_gem.empty?
    +    raise ArgumentError,
    +      "shim template profile requires shim.replacement_gem, KETTLE_JEM_SHIMMED_GEM, or --shimmed-gem"
    +  end
     
    -def ruby_require_call?(owner, method_name, argument)
    -  owner.is_a?(::Prism::CallNode) &&
    -    owner.name.to_s == method_name.to_s &&
    -    ruby_first_string_argument(owner).to_s == argument.to_s
    +  {
    +    replacement_gem: replacement_gem,
    +    replacement_require: replacement_require,
    +    replacement_git: replacement_git,
    +    legacy_requires: legacy_requires,
    +    primary_require: entrypoint_require.to_s,
    +    package_name: package_name.to_s,
    +    version_strategy: shim_config.dig("version", "strategy").to_s.empty? ? "shim" : shim_config.dig("version", "strategy").to_s
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 5399
    +      
    # File 'lib/kettle/jem.rb', line 13296
     
    -def ruby_string_argument(call)
    -  ruby_string_argument_at(call, 0)
    +def shim_profile_cleanups(project_root, facts, preferences, template_selection: {})
    +  return [] unless facts[:template_profile].to_s == SHIM_TEMPLATE_PROFILE
    +  return [] unless Array(template_selection[:only]).empty?
    +
    +  retained_paths = preferences.map { |preference| preference.fetch(:target_path).to_s }.to_set
    +  retained_paths << KETTLE_CONFIG_PATH
    +  SHIM_PROFILE_CLEANUP_GLOBS.flat_map do |pattern|
    +    Dir.glob(File.join(project_root, pattern), File::FNM_DOTMATCH).filter_map do |path|
    +      next unless File.file?(path)
    +
    +      relative_path = path.delete_prefix("#{project_root}/")
    +      next if retained_paths.include?(relative_path)
    +      next if relative_path.start_with?(".git/")
    +
    +      {target_path: relative_path}
    +    end
    +  end.uniq { |cleanup| cleanup.fetch(:target_path) }.sort_by { |cleanup| cleanup.fetch(:target_path) }
     end
    -
    # File 'lib/kettle/jem.rb', line 5403
    +      
    # File 'lib/kettle/jem.rb', line 10528
     
    -def ruby_string_argument_at(call, index)
    -  argument = call&.arguments&.arguments&.[](index)
    -  argument.unescaped if argument.is_a?(::Prism::StringNode)
    +def shim_replacement_namespace(replacement_require)
    +  replacement_require.to_s.tr("-", "/").split("/").reject(&:empty?).map do |segment|
    +    SHIM_REPLACEMENT_NAMESPACE_ACRONYMS.fetch(segment) do
    +      segment.split("_").map { |part| "#{part[0].to_s.upcase}#{part[1..]}" }.join
    +    end
    +  end.join("::")
     end
    -
    # File 'lib/kettle/jem.rb', line 5408
    +      
    # File 'lib/kettle/jem.rb', line 13204
     
    -def ruby_string_arguments(call)
    -  Array(call&.arguments&.arguments).filter_map do |argument|
    -    argument.unescaped if argument.is_a?(::Prism::StringNode)
    +def shim_template_entries(facts, config)
    +  package_name = facts.dig(:package, :name).to_s
    +  entrypoint_require = facts.dig(:rubygems, :entrypoint_require).to_s
    +  shim = facts.fetch(:shim)
    +  targets = SHIM_TEMPLATE_STATIC_ENTRIES.map do |target|
    +    source = SHIM_TEMPLATE_SOURCE_TARGETS.fetch(target, target)
    +    {"source" => source, "target" => target}
    +  end
    +  targets << {"source" => "shim/gem.gemspec", "target" => "#{package_name}.gemspec"}
    +  targets << {"source" => "shim/lib/version.rb", "target" => File.join("lib", entrypoint_require, "version.rb")}
    +  targets << {"source" => "shim/lib/entrypoint.rb", "target" => File.join("lib", "#{entrypoint_require}.rb")}
    +  Array(shim[:legacy_requires]).map(&:to_s).reject { |path| path == entrypoint_require }.each do |require_path|
    +    targets << {"source" => "shim/lib/compat_require.rb", "target" => File.join("lib", "#{require_path}.rb")}
       end
    +  targets.uniq { |entry| entry.fetch("target") }
     end
    -
    # File 'lib/kettle/jem.rb', line 4005
    -
    -def ruby_template_policy_report(recipe:, request:, original:, final:)
    -  return {} unless recipe.fetch(:primitive) == "supplied_template_source_application"
    -
    -  file_type = template_file_type(recipe)
    -  return {} unless %i[gemfile gemspec appraisals].include?(file_type)
    +      
    # File 'lib/kettle/jem.rb', line 9352
     
    -  template_content = request.fetch(:template_content, "")
    -  report = {
    -    policy_kind: "kettle_jem_ruby_template_policy",
    -    file_type: file_type.to_s
    -  }
    -  operations = case file_type
    -  when :gemfile
    -    gemfile_policy_operations(template_content, original, final, request)
    -  when :gemspec
    -    gemspec_policy_operations(template_content, original, final, request)
    -  when :appraisals
    -    appraisals_policy_operations(template_content, original, final, request)
    -  end
    -  report[:operations] = operations
    -  {ruby_template_policy: report}
    +def shim_template_entries_for_config(gemspec_path, config)
    +  package_name = config.dig("rubygems", "name").to_s.strip
    +  package_name = File.basename(gemspec_path.to_s, ".gemspec") if package_name.empty?
    +  entrypoint_require = config.dig("rubygems", "entrypoint_require").to_s.strip
    +  entrypoint_require = package_name.tr("-", "/") if entrypoint_require.empty?
    +  legacy_requires = Array(config.dig("shim", "legacy_requires")).map(&:to_s)
    +  legacy_requires << entrypoint_require
    +  shim = {legacy_requires: legacy_requires.uniq}
    +  shim_template_entries(
    +    {
    +      package: {name: package_name},
    +      rubygems: {entrypoint_require: entrypoint_require},
    +      shim: shim
    +    },
    +    config
    +  )
     end
    -
    # File 'lib/kettle/jem.rb', line 8811
    +      
    # File 'lib/kettle/jem.rb', line 9411
     
    -def ruby_top_level_require?(content, method_name, argument)
    -  context = Ast::Crispr::Ruby::Prism.document_context(content: content.to_s, source_label: "entrypoint.rb")
    -  context.structural_owners(owner_scope: :top_level_statements).any? do |owner|
    -    ruby_require_call?(owner, method_name, argument)
    -  end
    +def shim_template_profile?(facts)
    +  facts[:template_profile].to_s == SHIM_TEMPLATE_PROFILE
     end
    -
    # File 'lib/kettle/jem.rb', line 5338
    -
    -def ruby_top_level_require_records(content)
    -  body = prism_parse_success(content)&.value&.statements&.body || []
    -  body.filter_map do |node|
    -    next unless node.is_a?(::Prism::CallNode) && node.name == :require
    +      
    # File 'lib/kettle/jem.rb', line 10391
     
    -    name = ruby_string_argument(node)
    -    next unless name
    +def shim_template_tokens(shim)
    +  return {} unless shim.is_a?(Hash) && !shim.empty?
     
    -    {
    -      name: name,
    -      start_line: node.location.start_line,
    -      end_line: node.location.end_line
    -    }
    -  end
    +  {
    +    "KJ|SHIMMED_GEM_NAME" => shim[:replacement_gem].to_s,
    +    "KJ|SHIMMED_REQUIRE" => shim[:replacement_require].to_s,
    +    "KJ|SHIM_COMPAT_REQUIRES" => Array(shim[:legacy_requires]).join(", ")
    +  }
     end
    -
    # File 'lib/kettle/jem.rb', line 8919
    +      
    # File 'lib/kettle/jem.rb', line 10536
     
    -def ruby_version_class_eval_namespaces(content)
    -  ruby_call_records(content, :class_eval).filter_map do |call|
    -    receiver = call.receiver&.slice.to_s
    -    next unless receiver.end_with?("::Version")
    -    next unless call.block
    +def shim_version_file_content(namespace:, replacement_namespace:, replacement_require:)
    +  body = [
    +    "Version = #{replacement_namespace}::Version unless const_defined?(:Version, false)",
    +    "VERSION = #{replacement_namespace}::VERSION unless const_defined?(:VERSION, false)"
    +  ]
     
    -    receiver.delete_suffix("::Version")
    +  <<~RUBY
    +    # frozen_string_literal: true
    +
    +    require #{replacement_require.to_s.dump}
    +
    +    #{wrap_ruby_namespace(namespace, body).join("\n")}
    +  RUBY
    +end
    +
    +
    + +
    +

    + + .shunted_dependency_has_floor_compatible_version?(resolver, dependency, versions, floor) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + @@ -47823,45 +64226,64 @@

    -

    +

    - .ruby_version_constant_value(content) ⇒ Object + .shunted_dependency_has_modular_override?(project_root, dependency) ⇒ Boolean -

    +
    +
    +
    +3335
    +3336
    +3337
    +3338
    +3339
    +3340
    +3341
    +3342
    +3343
    +3344
    +3345
    +3346
    +
    +
    # File 'lib/kettle/jem.rb', line 3335
    +
    +def shunted_dependency_has_floor_compatible_version?(resolver, dependency, versions, floor)
    +  versions.any? do |entry|
    +    number = (entry[:number] || entry["number"]).to_s
    +    next false if number.empty?
    +
    +    min_ruby = resolver.min_ruby_version(dependency.fetch(:name), number) ||
    +      resolver.parse_min_ruby(entry[:ruby_version] || entry["ruby_version"])
    +    min_ruby.nil? || Gem::Version.new(min_ruby.to_s) <= floor
    +  rescue
    +    false
       end
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -47869,9 +64291,9 @@

    -

    +

    - .ruby_version_module_namespace(content) ⇒ Object + .shunted_effective_floor(min_ruby) ⇒ Object @@ -47883,25 +64305,25 @@

     
     
    -8887
    -8888
    -8889
    -8890
    -8891
    -8892
    -8893
    -8894
    +3366 +3367 +3368 +3369 +3370 +3371 +3372 +3373

    @@ -47909,9 +64331,9 @@

    -

    +

    - .ruby_version_module_namespace_for(node, namespace) ⇒ Object + .shunted_gemfile_block(gemspec, facts, run_options) ⇒ Object @@ -47923,36 +64345,68 @@

     
     
    -8896
    -8897
    -8898
    -8899
    -8900
    -8901
    -8902
    -8903
    -8904
    -8905
    -8906
    -8907
    -8908
    -8909
    +3294 +3295 +3296 +3297 +3298 +3299 +3300 +3301 +3302 +3303 +3304 +3305 +3306 +3307 +3308 +3309 +3310 +3311 +3312 +3313 +3314 +3315 +3316 +3317 +3318 +3319 +3320 +3321 +3322 +3323

    @@ -47961,9 +64415,9 @@

    -

    +

    - .ruby_word_array_names(node) ⇒ Object + .shunted_gemfile_managed_block(dependencies) ⇒ Object @@ -47975,19 +64429,39 @@

     
     
    -5480
    -5481
    -5482
    -5483
    -5484
    +3375 +3376 +3377 +3378 +3379 +3380 +3381 +3382 +3383 +3384 +3385 +3386 +3387 +3388 +3389

    @@ -47995,9 +64469,9 @@

    -

    +

    - .ruby_word_array_node?(node) ⇒ Boolean + .simplecov_config_require_call_node?(node) ⇒ Boolean @@ -48032,55 +64506,21 @@

     
     
    -5476
    -5477
    -5478
    - -

    - -
     
     
    -8875
    -8876
    -8877
    -8878
    -8879
    -8880
    -8881
    -8882
    -8883
    -8884
    -8885
    +3325 +3326 +3327 +3328 +3329 +3330 +3331 +3332 +3333
    -
    # File 'lib/kettle/jem.rb', line 8875
    +      
    # File 'lib/kettle/jem.rb', line 3325
     
    -def ruby_version_constant_value(content)
    -  result = prism_parse_success(content)
    -  return unless result
    +def shunted_dependency_has_modular_override?(project_root, dependency)
    +  root = project_root.to_s
    +  return false if root.empty?
     
    -  node = result.value.breadth_first_search_all do |candidate|
    -    candidate.is_a?(::Prism::ConstantWriteNode) &&
    -      candidate.name == :VERSION &&
    -      candidate.value.is_a?(::Prism::StringNode)
    -  end.first
    -  node&.value&.unescaped
    +  name = dependency.fetch(:name).to_s
    +  return false if name.empty? || name.include?("/") || name.include?("\\")
    +
    +  File.directory?(File.join(root, "gemfiles", "modular", name))
     end
    -
    # File 'lib/kettle/jem.rb', line 8887
    +      
    # File 'lib/kettle/jem.rb', line 3366
     
    -def ruby_version_module_namespace(content)
    -  body = prism_parse_success(content)&.value&.statements&.body || []
    -  body.each do |node|
    -    namespace = ruby_version_module_namespace_for(node, [])
    -    return namespace if namespace
    -  end
    -  nil
    +def shunted_effective_floor(min_ruby)
    +  floor = minimum_ruby_token(min_ruby)
    +  versions = [Gem::Version.new("2.3")]
    +  versions << Gem::Version.new(floor) unless floor.to_s.empty?
    +  versions.max
    +rescue ArgumentError
    +  Gem::Version.new("2.3")
     end
    -
    # File 'lib/kettle/jem.rb', line 8896
    +      
    # File 'lib/kettle/jem.rb', line 3294
     
    -def ruby_version_module_namespace_for(node, namespace)
    -  return unless node.is_a?(::Prism::ModuleNode)
    +def shunted_gemfile_block(gemspec, facts, run_options)
    +  resolver = run_options[:rubygems_resolver] || run_options["rubygems_resolver"] || RubyGemsResolver.new
    +  dependencies = extract_gemspec_development_dependencies(gemspec)
    +  return if dependencies.empty?
     
    -  current = namespace + ruby_constant_path_segments(node.constant_path)
    -  if current.last == "Version" && current.length > 1
    -    return current[0...-1].join("::")
    -  end
    +  floor = shunted_effective_floor(facts.dig(:rubygems, :min_ruby))
    +  project_root = facts[:project_root] || facts["project_root"] || run_options[:project_root] || run_options["project_root"]
    +  shunted = dependencies.filter_map do |dependency|
    +    next if shunted_dependency_has_modular_override?(project_root, dependency)
     
    -  node.body&.body&.each do |child|
    -    child_namespace = ruby_version_module_namespace_for(child, current)
    -    return child_namespace if child_namespace
    +    versions = resolver.versions(dependency.fetch(:name), requirements: dependency[:requirement])
    +    version = versions.max_by { |entry| Gem::Version.new((entry[:number] || entry["number"]).to_s) }
    +    next unless version
    +
    +    number = (version[:number] || version["number"]).to_s
    +    min_ruby = resolver.min_ruby_version(dependency.fetch(:name), number) ||
    +      resolver.parse_min_ruby(version[:ruby_version] || version["ruby_version"])
    +    next unless min_ruby && Gem::Version.new(min_ruby.to_s) > floor
    +    next if shunted_dependency_has_floor_compatible_version?(resolver, dependency, versions, floor)
    +
    +    dependency.merge(version: number, min_ruby: min_ruby.to_s)
    +  rescue
    +    nil
       end
    +  return if shunted.empty?
    +
    +  shunted_gemfile_managed_block(shunted)
    +rescue
       nil
     end
    -
    # File 'lib/kettle/jem.rb', line 5480
    +      
    # File 'lib/kettle/jem.rb', line 3375
     
    -def ruby_word_array_names(node)
    -  node.elements.filter_map do |element|
    -    element.unescaped if element.is_a?(::Prism::StringNode)
    +def shunted_gemfile_managed_block(dependencies)
    +  lines = [
    +    MANAGED_BLOCK_OPEN
    +  ]
    +  if dependencies.empty?
    +    lines << "# (no shunted dependencies)"
    +  else
    +    dependencies.sort_by { |dependency| dependency.fetch(:name) }.each do |dependency|
    +      requirement = dependency[:requirement].to_s.empty? ? "" : %(, "#{dependency.fetch(:requirement)}")
    +      lines << %(gem "#{dependency.fetch(:name)}"#{requirement} # ruby >= #{dependency.fetch(:min_ruby)})
    +    end
       end
    +  lines << MANAGED_BLOCK_CLOSE
    +  ensure_trailing_newline(lines.join("\n"))
     end
    -
    # File 'lib/kettle/jem.rb', line 5476
    -
    -def ruby_word_array_node?(node)
    -  node.is_a?(::Prism::ArrayNode) && node.opening_loc&.slice.to_s.start_with?("%w[")
    -end
    -
    -
    - -
    -

    - - .ruby_word_array_nodes(content) ⇒ Object - - - - - -

    - - @@ -48088,9 +64528,9 @@

    -

    +

    - .ruby_word_array_records(content) ⇒ Object + .simplecov_config_require_call_nodes(content) ⇒ Object @@ -48101,35 +64541,25 @@

    @@ -48138,9 +64568,9 @@

    -

    +

    - .run_apply_phases(project_root, report) ⇒ Object + .simplecov_config_require_call_records(content) ⇒ Object @@ -48152,111 +64582,35 @@

     
     
    -7695
    -7696
    -7697
    -7698
    -7699
    -7700
    -7701
    -7702
    -7703
    -7704
    -7705
    -7706
    -7707
    -7708
    -7709
    -7710
    -7711
    -7712
    -7713
    -7714
    -7715
    -7716
    -7717
    -7718
    -7719
    -7720
    -7721
    -7722
    -7723
    -7724
    -7725
    -7726
    -7727
    -7728
    -7729
    -7730
    -7731
    -7732
    -7733
    -7734
    -7735
    -7736
    -7737
    -7738
    -7739
    -7740
    -7741
    -7742
    -7743
    -7744
    -7745
    +6004 +6005 +6006 +6007 +6008 +6009 +6010 +6011 +6012 +6013 +6014 +6015 +6016

    @@ -48264,39 +64618,58 @@

    -

    +

    - .runtime_context_value(request, *path) ⇒ Object + .simplecov_do_cov_bootstrap_complete_node?(node) ⇒ Boolean -

    -
    -
    -
    -5467
    -5468
    -5469
    -5470
    -5471
    -5472
    -5473
    -5474
    +5802 +5803 +5804 +5805 +5806 +5807
    -
    # File 'lib/kettle/jem.rb', line 5467
    -
    -def ruby_word_array_nodes(content)
    -  result = prism_parse_success(content)
    -  return [] unless result
    +      
    # File 'lib/kettle/jem.rb', line 5802
     
    -  result.value.breadth_first_search_all do |node|
    -    ruby_word_array_node?(node)
    -  end
    +def simplecov_config_require_call_node?(node)
    +  node.is_a?(::Prism::CallNode) &&
    +    node.name == :require &&
    +    node.receiver.nil? &&
    +    ruby_string_argument(node) == "kettle/soup/cover/config"
     end
     
    -
    -5453
    -5454
    -5455
    -5456
    -5457
    -5458
    -5459
    -5460
    -5461
    -5462
    -5463
    -5464
    -5465
    + +6018 +6019 +6020 +6021 +6022 +6023 +6024 +6025
    -
    # File 'lib/kettle/jem.rb', line 5453
    +      
    # File 'lib/kettle/jem.rb', line 6018
     
    -def ruby_word_array_records(content)
    -  ruby_word_array_nodes(content).map do |node|
    -    {
    -      names: ruby_word_array_names(node),
    -      source: node.location.slice,
    -      start_line: node.location.start_line,
    -      end_line: node.location.end_line,
    -      start_column: node.location.start_column,
    -      start_offset: node.location.start_offset,
    -      end_offset: node.location.end_offset
    -    }
    +def simplecov_config_require_call_nodes(content)
    +  result = prism_parse_success(content)
    +  return [] unless result
    +
    +  result.value.breadth_first_search_all do |node|
    +    simplecov_config_require_call_node?(node)
       end
     end
    -
    # File 'lib/kettle/jem.rb', line 7695
    +      
    # File 'lib/kettle/jem.rb', line 6004
     
    -def run_apply_phases(project_root, report)
    -  plugin_registry = plugin_registry_for_project(project_root)
    -  changed_files = report.fetch(:changed_files)
    -  diagnostics = report.fetch(:diagnostics)
    -  context = PluginContext.new(
    -    project_root: project_root,
    -    mode: "apply",
    -    facts: report.fetch(:facts),
    -    recipe_pack: report.fetch(:recipe_pack),
    -    recipe_reports: report.fetch(:recipe_reports),
    -    phase_reports: report.fetch(:phase_reports),
    -    changed_files: changed_files,
    -    diagnostics: diagnostics
    -  )
    -  reports_by_phase = report.fetch(:recipe_reports).group_by { |recipe_report| recipe_report_phase(recipe_report) }
    -  active_runner_phases = report.fetch(:phase_reports).map { |phase_report| phase_report.fetch(:phase).to_sym }
    -  active_runner_phases.each do |phase|
    -    phase_report = report.fetch(:phase_reports).find { |entry| entry.fetch(:phase).to_sym == phase }
    -    phase_stats = phase_report.fetch(:stats)
    -    unless plugin_registry.empty?
    -      plugin_registry.run(
    -        timing: :before,
    -        phase: phase,
    -        context: context,
    -        actor: self,
    -        phase_stats: phase_stats
    -      )
    -    end
    -    reports_by_phase.fetch(phase, []).each do |recipe_report|
    -      apply_recipe_report(project_root, recipe_report)
    -    end
    -    unless plugin_registry.empty?
    -      plugin_registry.run(
    -        timing: :after,
    -        phase: phase,
    -        context: context,
    -        actor: self,
    -        phase_stats: phase_stats
    -      )
    -    end
    -  end
    -  unless plugin_registry.configured_plugins.empty?
    -    diagnostics << plugin_lifecycle_diagnostic(
    -      plugin_registry,
    -      callbacks_run: true,
    -      active_runner_phases: active_runner_phases
    -    )
    -  end
    -  changed_files.sort!
    -  report[:run_stats] = recipe_run_stats(report.fetch(:recipe_reports), diagnostics: diagnostics)
    +def simplecov_config_require_call_records(content)
    +  lines = content.to_s.lines
    +  ruby_call_records(content, :require).filter_map do |call|
    +    next unless simplecov_config_require_call_node?(call)
    +
    +    end_line = ruby_node_source_end_line(call)
    +    {
    +      start_line: call.location.start_line,
    +      end_line: end_line,
    +      source: (lines[(call.location.start_line - 1)..(end_line - 1)] || []).join
    +    }
    +  end.sort_by { |record| record.fetch(:start_line) }
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -48304,45 +64677,66 @@

    -

    +

    - .runtime_gemspec_dependency_insertion_index(lines, receiver:) ⇒ Object + .simplecov_do_cov_bootstrap_only_node?(node) ⇒ Boolean -

     
     
    -4120
    -4121
    -4122
    -4123
    -4124
    -4125
    -4126
    -4127
    +5917 +5918 +5919 +5920 +5921 +5922
    -
    # File 'lib/kettle/jem.rb', line 4120
    -
    -def runtime_context_value(request, *path)
    -  context = request[:runtime_context] || request["runtime_context"] || {}
    -  path.reduce(context) do |value, key|
    -    break nil unless value.respond_to?(:[])
    +      
    # File 'lib/kettle/jem.rb', line 5917
     
    -    value[key] || value[key.to_s]
    -  end
    +def simplecov_do_cov_bootstrap_complete_node?(node)
    +  subtree = prism_call_nodes(node)
    +  subtree.any? { |child| simplecov_require_call_node?(child) } &&
    +    subtree.any? { |child| simplecov_config_require_call_node?(child) } &&
    +    subtree.any? { |child| simplecov_start_call_node?(child) }
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -48350,9 +64744,9 @@

    -

    +

    - .security_supported_version_token(version) ⇒ Object + .simplecov_do_cov_bootstrap_records(content) ⇒ Object @@ -48364,29 +64758,51 @@

     
     
    -8146
    -8147
    -8148
    -8149
    -8150
    -8151
    -8152
    -8153
    -8154
    -8155
    +5885 +5886 +5887 +5888 +5889 +5890 +5891 +5892 +5893 +5894 +5895 +5896 +5897 +5898 +5899 +5900 +5901 +5902 +5903 +5904 +5905

    @@ -48394,9 +64810,9 @@

    -

    +

    - .selected_template_path?(relative_path, patterns) ⇒ Boolean + .simplecov_do_cov_predicate_node?(node) ⇒ Boolean @@ -48431,27 +64847,15 @@

     
     
    -7234
    -7235
    -7236
    -7237
    -7238
    -7239
    -7240
    -7241
    -7242
    +5907 +5908 +5909

    @@ -48459,29 +64863,58 @@

    -

    +

    - .semantic_readme_heading(text) ⇒ Object + .simplecov_kettle_soup_cover_require_call_node?(node) ⇒ Boolean -

     
     
    -6418
    -6419
    -6420
    -6421
    -6422
    -6423
    -6424
    -6425
    -6426
    -6427
    -6428
    +5924 +5925 +5926 +5927 +5928 +5929 +5930 +5931 +5932 +5933
    -
    # File 'lib/kettle/jem.rb', line 6418
    -
    -def runtime_gemspec_dependency_insertion_index(lines, receiver:)
    -  note_index = lines.find_index { |line| line.lstrip.start_with?("# NOTE: It is preferable to list development dependencies") }
    -  return note_index - 1 if note_index&.positive? && lines[note_index - 1].strip.empty?
    -  return note_index if note_index
    +      
    # File 'lib/kettle/jem.rb', line 5924
     
    -  development_line = gemspec_dependency_records(lines.join, receiver: receiver).find { |record| record.fetch(:kind) == "add_development_dependency" }&.fetch(:start_line)
    -  development_index = development_line && development_line - 1
    -  return development_index if development_index
    +def simplecov_do_cov_bootstrap_only_node?(node)
    +  calls = prism_call_nodes(node)
    +  return false if calls.empty?
     
    -  gemspec_end_line(lines.join) - 1
    +  calls.all? do |call|
    +    simplecov_require_call_node?(call) ||
    +      simplecov_config_require_call_node?(call) ||
    +      simplecov_start_call_node?(call)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 8146
    +      
    # File 'lib/kettle/jem.rb', line 5885
     
    -def security_supported_version_token(version)
    -  parsed = Gem::Version.new(version.to_s)
    -  major = parsed.segments.fetch(0, 0).to_i
    -  return "0.latest" if major.zero?
    +def simplecov_do_cov_bootstrap_records(content)
    +  result = prism_parse_success(content)
    +  return [] unless result
     
    -  minor = parsed.segments.fetch(1, 0).to_i
    -  "#{major}.#{minor}.latest"
    -rescue ArgumentError
    -  "0.latest"
    +  lines = content.to_s.lines
    +  result.value.breadth_first_search_all do |node|
    +    node.is_a?(::Prism::IfNode) &&
    +      simplecov_do_cov_predicate_node?(node.predicate) &&
    +      prism_subtree_contains_simplecov_require?(node)
    +  end.map do |node|
    +    end_line = ruby_node_source_end_line(node)
    +    source = (lines[(node.location.start_line - 1)..(end_line - 1)] || []).join
    +    {
    +      start_line: node.location.start_line,
    +      end_line: end_line,
    +      source: source,
    +      bootstrap_only: simplecov_do_cov_bootstrap_only_node?(node),
    +      complete: simplecov_do_cov_bootstrap_complete_node?(node)
    +    }
    +  end.sort_by { |record| record.fetch(:start_line) }
     end
    -
    # File 'lib/kettle/jem.rb', line 7234
    +      
    # File 'lib/kettle/jem.rb', line 5907
     
    -def selected_template_path?(relative_path, patterns)
    -  path = relative_path.to_s.delete_prefix("./")
    -  patterns.any? do |pattern|
    -    normalized = pattern.to_s.delete_prefix("./")
    -    path == normalized ||
    -      File.fnmatch?(normalized, path, File::FNM_PATHNAME | File::FNM_DOTMATCH | File::FNM_EXTGLOB) ||
    -      (normalized.end_with?("/**") && path.start_with?(normalized.delete_suffix("/**") + "/"))
    -  end
    +def simplecov_do_cov_predicate_node?(node)
    +  node&.location&.slice.to_s == "Kettle::Soup::Cover::DO_COV"
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -48489,9 +64922,9 @@

    -

    +

    - .setup_execution_context(env, run_options) ⇒ Object + .simplecov_obsolete_call_nodes(content) ⇒ Object @@ -48503,29 +64936,25 @@

     
     
    -7295
    -7296
    -7297
    -7298
    -7299
    -7300
    -7301
    -7302
    -7303
    -7304
    +5787 +5788 +5789 +5790 +5791 +5792 +5793 +5794

    @@ -48533,43 +64962,58 @@

    -

    +

    - .setup_guidance_diagnostic(config_existed:) ⇒ Object + .simplecov_require_call_node?(node) ⇒ Boolean -

     
     
    -10176
    -10177
    -10178
    +5809 +5810 +5811 +5812 +5813 +5814
    -
    # File 'lib/kettle/jem.rb', line 10176
    +      
    # File 'lib/kettle/jem.rb', line 5809
     
    -def semantic_readme_heading(text)
    -  normalize_readme_heading(text)
    +def simplecov_kettle_soup_cover_require_call_node?(node)
    +  node.is_a?(::Prism::CallNode) &&
    +    node.name == :require &&
    +    node.receiver.nil? &&
    +    ruby_string_argument(node) == "kettle-soup-cover"
     end
    -
    # File 'lib/kettle/jem.rb', line 7295
    +      
    # File 'lib/kettle/jem.rb', line 5787
     
    -def setup_execution_context(env, run_options)
    -  return {bundled: false, source: "bootstrap_mode", bundle_gemfile: nil} if DecisionPolicy.value_to_boolean((run_options || {})[:bootstrap_mode])
    +def simplecov_obsolete_call_nodes(content)
    +  result = prism_parse_success(content)
    +  return [] unless result
     
    -  bundle_gemfile = (env || {})["BUNDLE_GEMFILE"].to_s.strip
    -  {
    -    bundled: !bundle_gemfile.empty?,
    -    source: bundle_gemfile.empty? ? "process" : "BUNDLE_GEMFILE",
    -    bundle_gemfile: bundle_gemfile.empty? ? nil : bundle_gemfile
    -  }
    +  result.value.breadth_first_search_all do |node|
    +    simplecov_start_call_node?(node) || simplecov_config_require_call_node?(node) || simplecov_kettle_soup_cover_require_call_node?(node)
    +  end
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -48577,9 +65021,9 @@

    -

    +

    - .setup_project(project_root, env: ENV, run_options: {}, command_runner: nil) ⇒ Object + .simplecov_require_call_records(content) ⇒ Object @@ -48591,71 +65035,35 @@

     
     
    -3424
    -3425
    -3426
    -3427
    -3428
    -3429
    -3430
    -3431
    -3432
    -3433
    -3434
    -3435
    -3436
    -3437
    -3438
    -3439
    -3440
    -3441
    -3442
    -3443
    -3444
    -3445
    -3446
    -3447
    -3448
    -3449
    -3450
    -3451
    -3452
    -3453
    -3454
    +5990 +5991 +5992 +5993 +5994 +5995 +5996 +5997 +5998 +5999 +6000 +6001 +6002

    @@ -48663,29 +65071,56 @@

    -

    +

    - .shield_token(value) ⇒ Object + .simplecov_start_call_node?(node) ⇒ Boolean + + + + +

    +
    + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • +
    - -

     
     
    -7284
    -7285
    -7286
    -7287
    -7288
    -7289
    -7290
    -7291
    -7292
    -7293
    +5983 +5984 +5985 +5986 +5987 +5988
    -
    # File 'lib/kettle/jem.rb', line 7284
    +      
    # File 'lib/kettle/jem.rb', line 5983
     
    -def setup_guidance_diagnostic(config_existed:)
    -  {
    -    severity: "advisory",
    -    message: if config_existed
    -               "Kettle/Jem setup bootstrap mode found existing #{KETTLE_CONFIG_PATH}; run kettle-jem apply to template the project."
    -             else
    -               "Created #{KETTLE_CONFIG_PATH}. Review it, then run kettle-jem --accept-config to continue setup."
    -             end
    -  }
    +def simplecov_require_call_node?(node)
    +  node.is_a?(::Prism::CallNode) &&
    +    node.name == :require &&
    +    node.receiver.nil? &&
    +    ruby_string_argument(node) == "simplecov"
     end
    -
    # File 'lib/kettle/jem.rb', line 3424
    -
    -def setup_project(project_root, env: ENV, run_options: {}, command_runner: nil)
    -  root = File.expand_path(project_root.to_s)
    -  config_path = kettle_jem_config_path(root)
    -  config_existed = File.exist?(config_path)
    -  execution_context = setup_execution_context(env, run_options)
    -  plan = plan_project(root, env: env, run_options: run_options)
    -  selection = plan.fetch(:template_selection)
    -  bootstrap_only = selection[:bootstrap_mode] || (!config_existed && !selection[:accept_config])
    +      
    # File 'lib/kettle/jem.rb', line 5990
     
    -  if bootstrap_only
    -    bootstrap_report = plan.fetch(:recipe_reports).find { |report| report.fetch(:relative_path) == KETTLE_CONFIG_PATH }
    -    apply_recipe_report(root, bootstrap_report) if bootstrap_report&.fetch(:changed, false)
    -    changed_files = bootstrap_report&.fetch(:changed, false) ? [KETTLE_CONFIG_PATH] : []
    -    return plan.merge(
    -      mode: "setup",
    -      setup_status: config_existed ? "bootstrap_config_already_present" : "bootstrap_config_written",
    -      setup_execution_context: execution_context,
    -      ready: config_existed,
    -      changed_files: changed_files,
    -      diagnostics: plan.fetch(:diagnostics) + [setup_guidance_diagnostic(config_existed: config_existed)]
    -    )
    -  end
    +def simplecov_require_call_records(content)
    +  lines = content.to_s.lines
    +  ruby_call_records(content, :require).filter_map do |call|
    +    next unless simplecov_require_call_node?(call)
     
    -  install_kwargs = {project_root: root, env: env, run_options: run_options}
    -  install_kwargs[:command_runner] = command_runner if command_runner
    -  Tasks::InstallTask.run(**install_kwargs).merge(
    -    mode: "setup",
    -    setup_execution_context: execution_context,
    -    setup_status: config_existed ? "configured_project_applied" : "accepted_config_applied"
    -  )
    +    end_line = ruby_node_source_end_line(call)
    +    {
    +      start_line: call.location.start_line,
    +      end_line: end_line,
    +      source: (lines[(call.location.start_line - 1)..(end_line - 1)] || []).join
    +    }
    +  end.sort_by { |record| record.fetch(:start_line) }
     end
    +
    @@ -48693,9 +65128,9 @@

    -

    +

    - .shunted_effective_floor(min_ruby) ⇒ Object + .simplecov_start_call_nodes(content) ⇒ Object @@ -48707,25 +65142,25 @@

     
     
    -3032
    -3033
    -3034
    -3035
    -3036
    -3037
    -3038
    -3039
    +6027 +6028 +6029 +6030 +6031 +6032 +6033 +6034

    @@ -48733,9 +65168,9 @@

    -

    +

    - .shunted_gemfile_block(gemspec, facts, run_options) ⇒ Object + .simplecov_track_files_call_records(content) ⇒ Object @@ -48747,61 +65182,43 @@

     
     
    -2987
    -2988
    -2989
    -2990
    -2991
    -2992
    -2993
    -2994
    -2995
    -2996
    -2997
    -2998
    -2999
    -3000
    -3001
    -3002
    -3003
    -3004
    -3005
    -3006
    -3007
    -3008
    -3009
    -3010
    -3011
    -3012
    +5827 +5828 +5829 +5830 +5831 +5832 +5833 +5834 +5835 +5836 +5837 +5838 +5839 +5840 +5841 +5842 +5843

    @@ -48809,53 +65226,52 @@

    -

    +

    - .shunted_gemfile_managed_block(dependencies) ⇒ Object + .skip_disabled_integration_template?(target_path, config) ⇒ Boolean -

     
     
    -8944
    -8945
    -8946
    +5796 +5797 +5798 +5799 +5800
    -
    # File 'lib/kettle/jem.rb', line 8944
    +      
    # File 'lib/kettle/jem.rb', line 5796
     
    -def shield_token(value)
    -  value.to_s.gsub("-", "--").gsub("_", "__").gsub("::", "%3A%3A").tr(" ", "_")
    +def simplecov_start_call_node?(node)
    +  node.is_a?(::Prism::CallNode) &&
    +    node.name == :start &&
    +    node.receiver&.slice == "SimpleCov"
     end
    -
    # File 'lib/kettle/jem.rb', line 3032
    +      
    # File 'lib/kettle/jem.rb', line 6027
     
    -def shunted_effective_floor(min_ruby)
    -  floor = minimum_ruby_token(min_ruby)
    -  versions = [Gem::Version.new("2.3")]
    -  versions << Gem::Version.new(floor) unless floor.to_s.empty?
    -  versions.max
    -rescue ArgumentError
    -  Gem::Version.new("2.3")
    +def simplecov_start_call_nodes(content)
    +  result = prism_parse_success(content)
    +  return [] unless result
    +
    +  result.value.breadth_first_search_all do |node|
    +    simplecov_start_call_node?(node)
    +  end
     end
    -
    # File 'lib/kettle/jem.rb', line 2987
    -
    -def shunted_gemfile_block(gemspec, facts, run_options)
    -  resolver = run_options[:rubygems_resolver] || run_options["rubygems_resolver"] || RubyGemsResolver.new
    -  dependencies = extract_gemspec_development_dependencies(gemspec)
    -  return if dependencies.empty?
    +      
    # File 'lib/kettle/jem.rb', line 5827
     
    -  floor = shunted_effective_floor(facts.dig(:rubygems, :min_ruby))
    -  shunted = dependencies.filter_map do |dependency|
    -    versions = resolver.versions(dependency.fetch(:name), requirements: dependency[:requirement])
    -    version = versions.max_by { |entry| Gem::Version.new((entry[:number] || entry["number"]).to_s) }
    -    next unless version
    +def simplecov_track_files_call_records(content)
    +  lines = content.to_s.lines
    +  ruby_call_records(content, :track_files).filter_map do |call|
    +    next unless call.receiver.nil?
     
    -    number = (version[:number] || version["number"]).to_s
    -    min_ruby = resolver.min_ruby_version(dependency.fetch(:name), number) ||
    -      resolver.parse_min_ruby(version[:ruby_version] || version["ruby_version"])
    -    next unless min_ruby && Gem::Version.new(min_ruby.to_s) > floor
    +    arguments = call.arguments&.location&.slice.to_s
    +    next if arguments.empty?
     
    -    dependency.merge(version: number, min_ruby: min_ruby.to_s)
    -  rescue
    -    nil
    +    end_line = ruby_node_source_end_line(call)
    +    {
    +      start_line: call.location.start_line,
    +      end_line: end_line,
    +      source: (lines[(call.location.start_line - 1)..(end_line - 1)] || []).join,
    +      arguments_source: arguments
    +    }
       end
    -  return if shunted.empty?
    -
    -  shunted_gemfile_managed_block(shunted)
    -rescue
    -  nil
     end
    +
    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    @@ -48900,20 +65316,20 @@

     
     
    -10579
    -10580
    -10581
    -10582
    -10583
    -10584
    -10585
    -10586
    -10587
    -10588
    -10589
    +13591 +13592 +13593 +13594 +13595 +13596 +13597 +13598 +13599 +13600 +13601

     
     
    -3041
    -3042
    -3043
    -3044
    -3045
    -3046
    -3047
    -3048
    -3049
    -3050
    -3051
    -3052
    -3053
    -3054
    -3055
    +13603 +13604 +13605
    -
    # File 'lib/kettle/jem.rb', line 3041
    +      
    # File 'lib/kettle/jem.rb', line 13603
     
    -def shunted_gemfile_managed_block(dependencies)
    -  lines = [
    -    MANAGED_BLOCK_OPEN
    -  ]
    -  if dependencies.empty?
    -    lines << "# (no shunted dependencies)"
    -  else
    -    dependencies.sort_by { |dependency| dependency.fetch(:name) }.each do |dependency|
    -      requirement = dependency[:requirement].to_s.empty? ? "" : %(, "#{dependency.fetch(:requirement)}")
    -      lines << %(gem "#{dependency.fetch(:name)}"#{requirement} # ruby >= #{dependency.fetch(:min_ruby)})
    -    end
    -  end
    -  lines << MANAGED_BLOCK_CLOSE
    -  ensure_trailing_newline(lines.join("\n"))
    +def skip_disabled_integration_template?(target_path, config)
    +  disabled_integration_template_path?(target_path, config)
     end
    -
    # File 'lib/kettle/jem.rb', line 10579
    +      
    # File 'lib/kettle/jem.rb', line 13591
     
     def skip_packaged_gemfile_template?(target_path, config)
       return true if target_path.to_s.include?("gemfiles/modular/recording/") && !appraisal_recording_enabled?(config)
    @@ -48969,18 +65385,18 @@ 

     
     
    -10522
    -10523
    -10524
    -10525
    -10526
    -10527
    -10528
    -10529
    -10530
    +13536 +13537 +13538 +13539 +13540 +13541 +13542 +13543 +13544

    -
    # File 'lib/kettle/jem.rb', line 10522
    +      
    # File 'lib/kettle/jem.rb', line 13536
     
     def skip_packaged_license_template?(target_path, config)
       basename = managed_license_template_basename(target_path)
    @@ -49034,35 +65450,37 @@ 

     
     
    -10556
    -10557
    -10558
    -10559
    -10560
    -10561
    -10562
    -10563
    -10564
    -10565
    -10566
    -10567
    -10568
    -10569
    -10570
    -10571
    -10572
    -10573
    -10574
    -10575
    -10576
    -10577
    +13567 +13568 +13569 +13570 +13571 +13572 +13573 +13574 +13575 +13576 +13577 +13578 +13579 +13580 +13581 +13582 +13583 +13584 +13585 +13586 +13587 +13588 +13589

    -
    # File 'lib/kettle/jem.rb', line 10556
    +      
    # File 'lib/kettle/jem.rb', line 13567
     
     def skip_packaged_workflow_template?(target_path, config, include_patterns: nil)
       path = target_path.to_s
       return false unless path.start_with?(".github/workflows/")
    +  return true if disabled_integration_template_path?(path, config)
       return true if OPT_IN_GITHUB_WORKFLOWS.include?(path) && !selected_template_path?(path, Array(include_patterns))
     
       basename = File.basename(path, ".yml")
    @@ -49072,10 +65490,10 @@ 

    end min_ruby = config_test_min_ruby(config) - workflow_floor = ENGINE_WORKFLOW_RUBY_COMPATIBILITY_FLOORS[basename] + workflow_floor = Kettle::Rb::CompatMatrix.workflow_ruby_floor(basename) return true if workflow_floor && min_ruby && Gem::Version.new(workflow_floor) < min_ruby - engine = ENGINE_WORKFLOW_MAP[basename] + engine = Kettle::Rb::CompatMatrix.engine_workflow(basename) return true if engine && !enabled_ruby_engines(config).include?(engine) version = basename[/\Aruby-(\d+\.\d+)\z/, 1] @@ -49085,6 +65503,67 @@

    +
    + +
    +

    + + .skywalking_eyes_disabled_by_default?(config, license, disabled) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +12820
    +12821
    +12822
    +12823
    +12824
    +12825
    +12826
    +
    +
    # File 'lib/kettle/jem.rb', line 12820
    +
    +def skywalking_eyes_disabled_by_default?(config, license, disabled)
    +  return false if disabled.include?(SKYWALKING_EYES_INTEGRATION)
    +  return false if explicit_integration_enabled?(config, SKYWALKING_EYES_INTEGRATION)
    +
    +  licenses = integration_license_spdx(config, license)
    +  !license_eye_compatible_licenses?(licenses)
    +end
    +
    @@ -49102,15 +65581,15 @@

     
     
    -3132
    -3133
    -3134
    -3135
    -3136
    -3137
    +3641 +3642 +3643 +3644 +3645 +3646 -
    # File 'lib/kettle/jem.rb', line 3132
    +      
    # File 'lib/kettle/jem.rb', line 3641
     
     def snapshot_changed_files(project_root, changed_files)
       changed_files.to_h do |relative_path|
    @@ -49138,19 +65617,19 @@ 

     
     
    -8429
    -8430
    -8431
    -8432
    -8433
    -8434
    -8435
    -8436
    -8437
    -8438
    +10863 +10864 +10865 +10866 +10867 +10868 +10869 +10870 +10871 +10872

    -
    # File 'lib/kettle/jem.rb', line 8429
    +      
    # File 'lib/kettle/jem.rb', line 10863
     
     def social_facts(config, env)
       token_config = token_config_values(config)
    @@ -49182,17 +65661,17 @@ 

     
     
    -8444
    -8445
    -8446
    -8447
    -8448
    -8449
    -8450
    -8451
    +10878 +10879 +10880 +10881 +10882 +10883 +10884 +10885

    -
    # File 'lib/kettle/jem.rb', line 8444
    +      
    # File 'lib/kettle/jem.rb', line 10878
     
     def social_template_tokens(social)
       {
    @@ -49222,12 +65701,12 @@ 

     
     
    -8440
    -8441
    -8442
    +10874 +10875 +10876

    -
    # File 'lib/kettle/jem.rb', line 8440
    +      
    # File 'lib/kettle/jem.rb', line 10874
     
     def social_token_value(social_config, env, key)
       preferred_template_token_value(nil, social_config[key.to_s], env, SOCIAL_TOKEN_ENV_KEYS.fetch(key))
    @@ -49252,21 +65731,21 @@ 

     
     
    -6351
    -6352
    -6353
    -6354
    -6355
    -6356
    -6357
    -6358
    -6359
    -6360
    -6361
    -6362
    +8384 +8385 +8386 +8387 +8388 +8389 +8390 +8391 +8392 +8393 +8394 +8395

    -
    # File 'lib/kettle/jem.rb', line 6351
    +      
    # File 'lib/kettle/jem.rb', line 8384
     
     def sort_runtime_gemspec_dependency_lines(content, receiver:)
       records = gemspec_dependency_records(content, receiver: receiver).select do |record|
    @@ -49300,21 +65779,21 @@ 

     
     
    -4634
    -4635
    -4636
    -4637
    -4638
    -4639
    -4640
    -4641
    -4642
    -4643
    -4644
    -4645
    +5348 +5349 +5350 +5351 +5352 +5353 +5354 +5355 +5356 +5357 +5358 +5359

    -
    # File 'lib/kettle/jem.rb', line 4634
    +      
    # File 'lib/kettle/jem.rb', line 5348
     
     def source_blob_url(source_url, path)
       base = source_url.to_s.dup
    @@ -49348,21 +65827,21 @@ 

     
     
    -9074
    -9075
    -9076
    -9077
    -9078
    -9079
    -9080
    -9081
    -9082
    -9083
    -9084
    -9085
    +11876 +11877 +11878 +11879 +11880 +11881 +11882 +11883 +11884 +11885 +11886 +11887

    -
    # File 'lib/kettle/jem.rb', line 9074
    +      
    # File 'lib/kettle/jem.rb', line 11876
     
     def source_tree_url(source_url, path)
       base = source_url.to_s.dup
    @@ -49396,12 +65875,12 @@ 

     
     
    -9637
    -9638
    -9639
    +12496 +12497 +12498

    -
    # File 'lib/kettle/jem.rb', line 9637
    +      
    # File 'lib/kettle/jem.rb', line 12496
     
     def spdx_basename(spdx_id)
       spdx_id.to_s.sub(/\ALicenseRef-/, "")
    @@ -49426,14 +65905,14 @@ 

     
     
    -3321
    -3322
    -3323
    -3324
    -3325
    +3873 +3874 +3875 +3876 +3877

    -
    # File 'lib/kettle/jem.rb', line 3321
    +      
    # File 'lib/kettle/jem.rb', line 3873
     
     def spdx_from_basename(basename)
       return "LicenseRef-Big-Time-Public-License" if basename.to_s == "Big-Time-Public-License"
    @@ -49443,6 +65922,286 @@ 

    +

    + +
    +

    + + .spec_helper_simplecov_do_cov_bootstrap_source(indent) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5875
    +5876
    +5877
    +5878
    +5879
    +5880
    +5881
    +5882
    +5883
    +
    +
    # File 'lib/kettle/jem.rb', line 5875
    +
    +def spec_helper_simplecov_do_cov_bootstrap_source(indent)
    +  [
    +    "#{indent}if Kettle::Soup::Cover::DO_COV\n",
    +    "#{indent}  require \"simplecov\" # Loads project-local .simplecov.\n",
    +    "#{indent}  require \"kettle/soup/cover/config\"\n",
    +    "#{indent}  SimpleCov.start\n",
    +    "#{indent}end\n"
    +  ].join
    +end
    +
    +
    + +
    +

    + + .stale_generated_gemspec_files_group?(group) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +8089
    +8090
    +8091
    +8092
    +8093
    +8094
    +8095
    +8096
    +8097
    +8098
    +8099
    +8100
    +8101
    +8102
    +8103
    +8104
    +8105
    +8106
    +8107
    +8108
    +8109
    +8110
    +8111
    +8112
    +
    +
    # File 'lib/kettle/jem.rb', line 8089
    +
    +def stale_generated_gemspec_files_group?(group)
    +  node = group.fetch(:node)
    +  if node.is_a?(::Prism::StringNode)
    +    path = node.unescaped.to_s
    +    basename = File.basename(path, ".md")
    +    return true if %w[
    +      CITATION.md
    +      CITATION.cff
    +      CODE_OF_CONDUCT.md
    +      CONTRIBUTING.md
    +      FUNDING.md
    +      RUBOCOP.md
    +      SECURITY.md
    +    ].include?(path)
    +    return true if path.end_with?(".md") && basename != "LICENSE" && known_license_template_basenames.include?(basename)
    +
    +    return false
    +  end
    +
    +  key = group.fetch(:key)
    +  return false unless key.is_a?(Array) && key.first == :splat
    +
    +  stale_generated_gemspec_splat_key?(key[1])
    +end
    +
    +
    + +
    +

    + + .stale_generated_gemspec_splat_key?(key) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +8114
    +8115
    +8116
    +8117
    +8118
    +8119
    +8120
    +8121
    +8122
    +
    +
    # File 'lib/kettle/jem.rb', line 8114
    +
    +def stale_generated_gemspec_splat_key?(key)
    +  return false unless key.is_a?(Array) && key.first == :call
    +
    +  receiver, method_name, arguments = key[1], key[2], Array(key[3])
    +  return true if receiver == "enumerate_package_files" && method_name == :call && %w[certs sig].include?(arguments.first.to_s)
    +  return true if receiver == "Dir" && method_name == :[] && arguments.first.to_s == "sig/**/*.rbs"
    +
    +  false
    +end
    +
    +
    + +
    +

    + + .stale_github_workflow_template_pin_records(relative_path, final_content, destination_content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14670
    +14671
    +14672
    +14673
    +14674
    +14675
    +14676
    +14677
    +14678
    +14679
    +14680
    +14681
    +14682
    +14683
    +14684
    +14685
    +14686
    +14687
    +14688
    +14689
    +14690
    +14691
    +14692
    +14693
    +14694
    +14695
    +14696
    +
    +
    # File 'lib/kettle/jem.rb', line 14670
    +
    +def stale_github_workflow_template_pin_records(relative_path, final_content, destination_content)
    +  destination_records = github_workflow_action_pin_records(destination_content)
    +  final_records = github_workflow_action_pin_records(final_content)
    +  canonical_records = github_actions_step_pins.values.flat_map do |pin|
    +    github_workflow_action_pin_records("uses: #{pin}\n")
    +  end
    +  return [] if destination_records.empty? || final_records.empty? || canonical_records.empty?
    +
    +  destination_by_key = destination_records.to_h { |record| [github_workflow_action_pin_key(record), record] }
    +  canonical_by_key = canonical_records.to_h { |record| [github_workflow_action_pin_key(record), record] }
    +  final_records.filter_map do |record|
    +    key = github_workflow_action_pin_key(record)
    +    destination = destination_by_key[key]
    +    canonical = canonical_by_key[key]
    +    next unless destination && canonical
    +    next unless destination.fetch(:sha) == record.fetch(:sha)
    +    next if canonical.fetch(:sha) == record.fetch(:sha)
    +
    +    {
    +      path: relative_path.to_s,
    +      action: record.fetch(:action),
    +      version: record.fetch(:version),
    +      preserved_sha: record.fetch(:sha),
    +      template_sha: canonical.fetch(:sha)
    +    }
    +  end
    +end
    +
    @@ -49483,18 +66242,18 @@

     
     
    -7538
    -7539
    -7540
    -7541
    -7542
    -7543
    -7544
    -7545
    -7546
    +9861 +9862 +9863 +9864 +9865 +9866 +9867 +9868 +9869 -
    # File 'lib/kettle/jem.rb', line 7538
    +      
    # File 'lib/kettle/jem.rb', line 9861
     
     def stale_versioned_engine_workflow?(relative_path)
       return false if preferred_template_source(PACKAGED_TEMPLATE_ROOT, relative_path)
    @@ -49525,18 +66284,18 @@ 

     
     
    -5607
    -5608
    -5609
    -5610
    -5611
    -5612
    -5613
    -5614
    -5615
    +7011 +7012 +7013 +7014 +7015 +7016 +7017 +7018 +7019

    -
    # File 'lib/kettle/jem.rb', line 5607
    +      
    # File 'lib/kettle/jem.rb', line 7011
     
     def standard_test_appraisal_names(content)
       appraisal_call_records(content).filter_map do |record|
    @@ -49567,21 +66326,21 @@ 

     
     
    -8539
    -8540
    -8541
    -8542
    -8543
    -8544
    -8545
    -8546
    -8547
    -8548
    -8549
    -8550
    +11171 +11172 +11173 +11174 +11175 +11176 +11177 +11178 +11179 +11180 +11181 +11182

    -
    # File 'lib/kettle/jem.rb', line 8539
    +      
    # File 'lib/kettle/jem.rb', line 11171
     
     def (content, key)
       ruby_call_records(content, :[]=).each do |call|
    @@ -49638,19 +66397,19 @@ 

     
     
    -8552
    -8553
    -8554
    -8555
    -8556
    -8557
    -8558
    -8559
    -8560
    -8561
    +11184 +11185 +11186 +11187 +11188 +11189 +11190 +11191 +11192 +11193

    -
    # File 'lib/kettle/jem.rb', line 8552
    +      
    # File 'lib/kettle/jem.rb', line 11184
     
     def (content, key)
       ruby_call_records(content, :[]=).any? do |call|
    @@ -49682,34 +66441,36 @@ 

     
     
    -8509
    -8510
    -8511
    -8512
    -8513
    -8514
    -8515
    -8516
    -8517
    -8518
    -8519
    -8520
    -8521
    -8522
    -8523
    -8524
    -8525
    -8526
    -8527
    -8528
    -8529
    -8530
    -8531
    -8532
    -8533
    +11139 +11140 +11141 +11142 +11143 +11144 +11145 +11146 +11147 +11148 +11149 +11150 +11151 +11152 +11153 +11154 +11155 +11156 +11157 +11158 +11159 +11160 +11161 +11162 +11163 +11164 +11165

    -
    # File 'lib/kettle/jem.rb', line 8509
    +      
    # File 'lib/kettle/jem.rb', line 11139
     
     def (gemspec_path)
       return {} unless gemspec_path && File.file?(gemspec_path)
    @@ -49734,11 +66495,49 @@ 

    } static_source_code_uri = (content, "source_code_uri") [:source_code_uri] = static_source_code_uri if static_source_code_uri + static_homepage_uri = (content, "homepage_uri") + [:homepage_uri] = static_homepage_uri if static_homepage_uri end

    +

    + +
    +

    + + .step_event_mark(step) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3580
    +3581
    +3582
    +3583
    +3584
    +3585
    +
    +
    # File 'lib/kettle/jem.rb', line 3580
    +
    +def step_event_mark(step)
    +  return ">" if event_payload_value(step, :status).to_s == "started"
    +  return "F" if %w[failed blocked].include?(event_payload_value(step, :status).to_s)
    +
    +  Array(event_payload_value(step, :changed_files) || []).empty? ? "." : "*"
    +end
    +
    @@ -49756,91 +66555,98 @@

     
     
    -7329
    -7330
    -7331
    -7332
    -7333
    -7334
    -7335
    -7336
    -7337
    -7338
    -7339
    -7340
    -7341
    -7342
    -7343
    -7344
    -7345
    -7346
    -7347
    -7348
    -7349
    -7350
    -7351
    -7352
    -7353
    -7354
    -7355
    -7356
    -7357
    -7358
    -7359
    -7360
    -7361
    -7362
    -7363
    -7364
    -7365
    -7366
    -7367
    -7368
    -7369
    -7370
    -7371
    -7372
    -7373
    -7374
    -7375
    -7376
    -7377
    -7378
    -7379
    -7380
    -7381
    -7382
    -7383
    -7384
    -7385
    -7386
    -7387
    -7388
    -7389
    -7390
    -7391
    -7392
    -7393
    -7394
    -7395
    -7396
    -7397
    -7398
    -7399
    -7400
    -7401
    -7402
    -7403
    -7404
    -7405
    -7406
    -7407
    -7408
    -7409
    -7410
    +9651 +9652 +9653 +9654 +9655 +9656 +9657 +9658 +9659 +9660 +9661 +9662 +9663 +9664 +9665 +9666 +9667 +9668 +9669 +9670 +9671 +9672 +9673 +9674 +9675 +9676 +9677 +9678 +9679 +9680 +9681 +9682 +9683 +9684 +9685 +9686 +9687 +9688 +9689 +9690 +9691 +9692 +9693 +9694 +9695 +9696 +9697 +9698 +9699 +9700 +9701 +9702 +9703 +9704 +9705 +9706 +9707 +9708 +9709 +9710 +9711 +9712 +9713 +9714 +9715 +9716 +9717 +9718 +9719 +9720 +9721 +9722 +9723 +9724 +9725 +9726 +9727 +9728 +9729 +9730 +9731 +9732 +9733 +9734 +9735 +9736 +9737 +9738 +9739 -
    # File 'lib/kettle/jem.rb', line 7329
    +      
    # File 'lib/kettle/jem.rb', line 9651
     
     def (recipe, deletion)
        = {
    @@ -49889,6 +66695,13 @@ 

    deleted_file: recipe.fetch(:target_path) ) end + if recipe.fetch(:primitive) == "supplied_shim_profile_file_deletion" + .merge!( + policy_kind: "delete_shim_profile_file", + operation: "delete", + deleted_file: recipe.fetch(:target_path) + ) + end if recipe.fetch(:primitive) == "supplied_template_source_preference" .merge!( policy_kind: "select_template_source", @@ -49944,12 +66757,12 @@

     
     
    -9969
    -9970
    -9971
    +12900 +12901 +12902

    -
    # File 'lib/kettle/jem.rb', line 9969
    +      
    # File 'lib/kettle/jem.rb', line 12900
     
     def stringify_template_tokens(tokens)
       tokens.to_h.transform_keys(&:to_s).transform_values(&:to_s)
    @@ -49974,19 +66787,19 @@ 

     
     
    -7136
    -7137
    -7138
    -7139
    -7140
    -7141
    -7142
    -7143
    -7144
    -7145
    +9455 +9456 +9457 +9458 +9459 +9460 +9461 +9462 +9463 +9464

    -
    # File 'lib/kettle/jem.rb', line 7136
    +      
    # File 'lib/kettle/jem.rb', line 9455
     
     def strip_leading_decorative_graphemes(text)
       remaining = text.to_s.sub(/\A\s+/, "")
    @@ -50018,19 +66831,19 @@ 

     
     
    -4189
    -4190
    -4191
    -4192
    -4193
    -4194
    -4195
    -4196
    -4197
    -4198
    +4890 +4891 +4892 +4893 +4894 +4895 +4896 +4897 +4898 +4899

    -
    # File 'lib/kettle/jem.rb', line 4189
    +      
    # File 'lib/kettle/jem.rb', line 4890
     
     def strip_orphaned_rake_task_requires(content)
       guarded_requires = %w[kettle/dev kettle/jem stone_checksums]
    @@ -50062,12 +66875,12 @@ 

     
     
    -10180
    -10181
    -10182
    +13128 +13129 +13130

    -
    # File 'lib/kettle/jem.rb', line 10180
    +      
    # File 'lib/kettle/jem.rb', line 13128
     
     def strip_readme_heading_adornment(text)
       text.to_s.sub(/\A(?:\d\uFE0F?\u20E3|[^[:alnum:][:space:]])+[ \t]*/u, "")
    @@ -50092,12 +66905,12 @@ 

    -6757 -6758 -6759

    +8935 +8936 +8937
    -
    # File 'lib/kettle/jem.rb', line 6757
    +      
    # File 'lib/kettle/jem.rb', line 8935
     
     def sync_kettle_config_documentation_comments(content)
       sync_readme_top_logos_documentation_comment(content)
    @@ -50122,25 +66935,25 @@ 

     
     
    -6703
    -6704
    -6705
    -6706
    -6707
    -6708
    -6709
    -6710
    -6711
    -6712
    -6713
    -6714
    +8837 +8838 +8839 +8840 +8841 +8842 +8843 +8844 +8845 +8846 +8847 +8848

    -
    # File 'lib/kettle/jem.rb', line 6703
    +      
    # File 'lib/kettle/jem.rb', line 8837
     
     def sync_kettle_config_env_overrides(content, env)
       synced = KETTLE_CONFIG_ENV_SYNC_PATHS.reduce(content.to_s) do |updated, (path, env_key)|
    -    value = env[env_key].to_s.strip
    +    value = env_sync_value(env, env_key)
         next updated unless present_template_token_value?(value)
     
         replace_yaml_scalar_path(updated, path, yaml_config_scalar_literal(value, path: path))
    @@ -50170,27 +66983,27 @@ 

    -3214 -3215 -3216 -3217 -3218 -3219 -3220 -3221 -3222 -3223 -3224 -3225 -3226 -3227 -3228 -3229 -3230 -3231

    +3766 +3767 +3768 +3769 +3770 +3771 +3772 +3773 +3774 +3775 +3776 +3777 +3778 +3779 +3780 +3781 +3782 +3783
    -
    # File 'lib/kettle/jem.rb', line 3214
    +      
    # File 'lib/kettle/jem.rb', line 3766
     
     def sync_kettle_config_gemspec_strategy_lines!(lines, gemspec_path, profile)
       gemspec = gemspec_path.to_s
    @@ -50230,14 +67043,14 @@ 

     
     
    -6716
    -6717
    -6718
    -6719
    -6720
    +8858 +8859 +8860 +8861 +8862

    -
    # File 'lib/kettle/jem.rb', line 6716
    +      
    # File 'lib/kettle/jem.rb', line 8858
     
     def sync_kettle_config_internal_values(content)
       KETTLE_CONFIG_INTERNAL_SYNC_PATHS.reduce(content.to_s) do |updated, (path, value_provider)|
    @@ -50264,43 +67077,43 @@ 

    -3179 -3180 -3181 -3182 -3183 -3184 -3185 -3186 -3187 -3188 -3189 -3190 -3191 -3192 -3193 -3194 -3195 -3196 -3197 -3198 -3199 -3200 -3201 -3202 -3203 -3204 -3205 -3206 -3207 -3208 -3209 -3210 -3211 -3212

    +3731 +3732 +3733 +3734 +3735 +3736 +3737 +3738 +3739 +3740 +3741 +3742 +3743 +3744 +3745 +3746 +3747 +3748 +3749 +3750 +3751 +3752 +3753 +3754 +3755 +3756 +3757 +3758 +3759 +3760 +3761 +3762 +3763 +3764
    -
    # File 'lib/kettle/jem.rb', line 3179
    +      
    # File 'lib/kettle/jem.rb', line 3731
     
     def sync_kettle_config_monorepo_subgem_profile(content, gemspec_path, profile)
       normalized_profile = normalize_template_profile(profile)
    @@ -50356,37 +67169,37 @@ 

    -6761 -6762 -6763 -6764 -6765 -6766 -6767 -6768 -6769 -6770 -6771 -6772 -6773 -6774 -6775 -6776 -6777 -6778 -6779 -6780 -6781 -6782 -6783 -6784 -6785 -6786 -6787 -6788

    +8939 +8940 +8941 +8942 +8943 +8944 +8945 +8946 +8947 +8948 +8949 +8950 +8951 +8952 +8953 +8954 +8955 +8956 +8957 +8958 +8959 +8960 +8961 +8962 +8963 +8964 +8965 +8966
    -
    # File 'lib/kettle/jem.rb', line 6761
    +      
    # File 'lib/kettle/jem.rb', line 8939
     
     def sync_readme_top_logos_documentation_comment(content)
       lines = content.to_s.lines
    @@ -50424,142 +67237,138 @@ 

    - .synchronize_github_actions_ci(_content, facts) ⇒ Object - - - - - -

    - - -
    -
    -
    -
    -11102
    -11103
    -11104
    -11105
    -11106
    -11107
    -11108
    -11109
    -11110
    -11111
    -11112
    -11113
    -11114
    -11115
    -11116
    -11117
    -11118
    -11119
    -11120
    -11121
    -11122
    -11123
    -11124
    -11125
    -11126
    -11127
    -11128
    -11129
    -11130
    -11131
    -11132
    -11133
    -11134
    -11135
    -11136
    -11137
    -11138
    -11139
    -11140
    -11141
    -11142
    -11143
    -11144
    -11145
    -11146
    -11147
    -11148
    -11149
    -11150
    -11151
    -11152
    -11153
    -11154
    -11155
    -11156
    -11157
    -11158
    -11159
    -11160
    -11161
    -
    -
    # File 'lib/kettle/jem.rb', line 11102
    -
    -def synchronize_github_actions_ci(_content, facts)
    +    .synchronize_github_actions_ci(content, facts)  ⇒ Object 
    +  
    +
    +  
    +
    +  
    +
    +  
    +    
    +    
    +
    +
    +
    +14150
    +14151
    +14152
    +14153
    +14154
    +14155
    +14156
    +14157
    +14158
    +14159
    +14160
    +14161
    +14162
    +14163
    +14164
    +14165
    +14166
    +14167
    +14168
    +14169
    +14170
    +14171
    +14172
    +14173
    +14174
    +14175
    +14176
    +14177
    +14178
    +14179
    +14180
    +14181
    +14182
    +14183
    +14184
    +14185
    +14186
    +14187
    +14188
    +14189
    +14190
    +14191
    +14192
    +14193
    +14194
    +14195
    +14196
    +14197
    +14198
    +14199
    +14200
    +14201
    +14202
    +14203
    +14204
    +14205
    +14206
    +14207
    +
    +
    # File 'lib/kettle/jem.rb', line 14150
    +
    +def synchronize_github_actions_ci(content, facts)
       package = facts.fetch(:package)
       ci = facts.fetch(:ci)
       ruby_versions = ci.fetch(:ruby_versions)
    -  ruby_matrix = ruby_versions.map { |version| "          - \"#{version}\"" }.join("\n")
    -
    -  <<~YAML
    -    name: CI
    -
    -    permissions:
    -      contents: read
    -
    -    on:
    -      push:
    -        branches:
    -          - "#{ci.fetch(:default_branch)}"
    -          - "*-stable"
    -        tags:
    -          - "!*" # Do not execute on tags
    -      pull_request:
    -        branches:
    -          - "*"
    -      workflow_dispatch:
    -
    -    concurrency:
    -      group: "${{ github.workflow }}-${{ github.ref }}"
    -      cancel-in-progress: true
    -
    -    jobs:
    -      test:
    -        if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
    -        name: Specs ${{ matrix.ruby }}
    -        runs-on: ubuntu-latest
    -        continue-on-error: ${{ endsWith(matrix.ruby, 'head') }}
    -        strategy:
    -          fail-fast: false
    -          matrix:
    -            ruby:
    -    #{ruby_matrix}
    -            rubygems:
    -              - default
    -            bundler:
    -              - default
    -
    -        steps:
    -          - name: Checkout #{package.fetch(:name)}
    -            uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
    -
    -          - name: Setup Ruby & RubyGems
    -            uses: ruby/setup-ruby@89f90524b88a01fe6e0b732220432cc6142926af # v1.313.0
    -            with:
    -              ruby-version: "${{ matrix.ruby }}"
    -              rubygems: "${{ matrix.rubygems }}"
    -              bundler: "${{ matrix.bundler }}"
    -              bundler-cache: true
    -
    -          - name: Tests
    -            run: bundle exec #{ci.fetch(:exec_cmd)}
    -  YAML
    -end
    + lines = [ + "name: CI", + "", + "permissions:", + " contents: read", + "", + "on:", + " push:", + " branches:", + *github_actions_push_branches_yaml(content, default_branch: ci.fetch(:default_branch), indent: " ").lines(chomp: true), + " tags:", + " - \"!*\" # Do not execute on tags", + " pull_request:", + " branches:", + " - \"*\"", + " workflow_dispatch:", + "", + "concurrency:", + " group: \"${{ github.workflow }}-${{ github.ref }}\"", + " cancel-in-progress: true", + "", + "jobs:", + " test:", + " if: \"!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')\"", + " name: Specs ${{ matrix.ruby }}", + " runs-on: ubuntu-latest", + " continue-on-error: ${{ endsWith(matrix.ruby, 'head') }}", + " strategy:", + " fail-fast: false", + " matrix:", + " ruby:", + *ruby_versions.map { |version| " - \"#{version}\"" }, + " rubygems:", + " - default", + " bundler:", + " - default", + "", + " steps:", + " - name: Checkout #{package.fetch(:name)}", + " uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0", + "", + *github_actions_setup_ruby_steps(indent: " ").lines(chomp: true), + "", + *github_actions_rspec_status_cache_step( + cache_scope: "ci", + key_parts: ["${{matrix.ruby}}"], + indent: " " + ).lines(chomp: true), + "", + " - name: Tests", + " run: bundle exec #{ci.fetch(:exec_cmd)}" + ] + "#{lines.join("\n")}\n" +end
    @@ -50568,194 +67377,208 @@

    - .synchronize_github_actions_coverage_ci(_content, facts) ⇒ Object - - - - - -

    - - -
    -
    -
    -
    -11265
    -11266
    -11267
    -11268
    -11269
    -11270
    -11271
    -11272
    -11273
    -11274
    -11275
    -11276
    -11277
    -11278
    -11279
    -11280
    -11281
    -11282
    -11283
    -11284
    -11285
    -11286
    -11287
    -11288
    -11289
    -11290
    -11291
    -11292
    -11293
    -11294
    -11295
    -11296
    -11297
    -11298
    -11299
    -11300
    -11301
    -11302
    -11303
    -11304
    -11305
    -11306
    -11307
    -11308
    -11309
    -11310
    -11311
    -11312
    -11313
    -11314
    -11315
    -11316
    -11317
    -11318
    -11319
    -11320
    -11321
    -11322
    -11323
    -11324
    -11325
    -11326
    -11327
    -11328
    -11329
    -11330
    -11331
    -11332
    -11333
    -11334
    -11335
    -11336
    -11337
    -11338
    -11339
    -11340
    -11341
    -11342
    -11343
    -11344
    -11345
    -11346
    -11347
    -11348
    -11349
    -11350
    -
    -
    # File 'lib/kettle/jem.rb', line 11265
    -
    -def synchronize_github_actions_coverage_ci(_content, facts)
    +    .synchronize_github_actions_coverage_ci(content, facts)  ⇒ Object 
    +  
    +
    +  
    +
    +  
    +
    +  
    +    
    +    
    +
    +
    +
    +14344
    +14345
    +14346
    +14347
    +14348
    +14349
    +14350
    +14351
    +14352
    +14353
    +14354
    +14355
    +14356
    +14357
    +14358
    +14359
    +14360
    +14361
    +14362
    +14363
    +14364
    +14365
    +14366
    +14367
    +14368
    +14369
    +14370
    +14371
    +14372
    +14373
    +14374
    +14375
    +14376
    +14377
    +14378
    +14379
    +14380
    +14381
    +14382
    +14383
    +14384
    +14385
    +14386
    +14387
    +14388
    +14389
    +14390
    +14391
    +14392
    +14393
    +14394
    +14395
    +14396
    +14397
    +14398
    +14399
    +14400
    +14401
    +14402
    +14403
    +14404
    +14405
    +14406
    +14407
    +14408
    +14409
    +14410
    +14411
    +14412
    +14413
    +14414
    +14415
    +14416
    +14417
    +14418
    +14419
    +14420
    +14421
    +14422
    +14423
    +14424
    +14425
    +14426
    +14427
    +14428
    +14429
    +14430
    +14431
    +14432
    +14433
    +14434
    +14435
    +14436
    +
    +
    # File 'lib/kettle/jem.rb', line 14344
    +
    +def synchronize_github_actions_coverage_ci(content, facts)
       ci = facts.fetch(:ci)
       coverage = ci.fetch(:coverage)
    -  <<~YAML
    -    name: Test Coverage
    -
    -    permissions:
    -      contents: read
    -      pull-requests: write
    -      id-token: write
    -
    -    env:
    -      K_SOUP_COV_MIN_BRANCH: 100
    -      K_SOUP_COV_MIN_LINE: 100
    -      K_SOUP_COV_MIN_HARD: true
    -      K_SOUP_COV_FORMATTERS: "xml,rcov,lcov,tty"
    -      K_SOUP_COV_DO: true
    -      K_SOUP_COV_MULTI_FORMATTERS: true
    -      K_SOUP_COV_COMMAND_NAME: "Test Coverage"
    -
    -    on:
    -      push:
    -        branches:
    -          - "#{ci.fetch(:default_branch)}"
    -          - "*-stable"
    -        tags:
    -          - "!*" # Do not execute on tags
    -      pull_request:
    -        branches:
    -          - "*"
    -      workflow_dispatch:
    -
    -    concurrency:
    -      group: "${{ github.workflow }}-${{ github.ref }}"
    -      cancel-in-progress: true
    -
    -    jobs:
    -      coverage:
    -        if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
    -        name: Code Coverage on ${{ matrix.ruby }}@current
    -        runs-on: ubuntu-latest
    -        continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}
    -        env:
    -          BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
    -        strategy:
    -          fail-fast: false
    -          matrix:
    -            include:
    -              - ruby: "ruby"
    -                appraisal: "#{coverage.fetch(:appraisal)}"
    -                exec_cmd: "#{coverage.fetch(:command)}"
    -                rubygems: latest
    -                bundler: latest
    -
    -        steps:
    -          - name: Checkout
    -            uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
    -
    -          - name: Setup Ruby & RubyGems
    -            uses: ruby/setup-ruby@89f90524b88a01fe6e0b732220432cc6142926af # v1.313.0
    -            with:
    -              ruby-version: "${{ matrix.ruby }}"
    -              rubygems: "${{ matrix.rubygems }}"
    -              bundler: "${{ matrix.bundler }}"
    -              bundler-cache: true
    -
    -          - name: "[Attempt 1] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
    -            id: bundleAppraisalAttempt1
    -            run: bundle exec appraisal ${{ matrix.appraisal }} install
    -            continue-on-error: true
    -
    -          - name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}"
    -            id: bundleAppraisalAttempt2
    -            if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}
    -            run: bundle exec appraisal ${{ matrix.appraisal }} install
    -
    -          - name: Tests for ${{ matrix.ruby }}@current via ${{ matrix.exec_cmd }}
    -            run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}
    -
    -          - name: Verify coverage reports
    -            run: |
    -              test -s coverage/lcov.info
    -              test -s coverage/coverage.xml
    -    #{github_actions_coverage_steps}
    -  YAML
    -end
    + coverage_steps = github_actions_coverage_steps(disabled_integrations: facts.dig(:integrations, :disabled)) + lines = [ + "name: Test Coverage", + "", + "permissions:", + " contents: read", + " pull-requests: write", + " id-token: write", + "", + "env:", + " K_SOUP_COV_MIN_BRANCH: 100", + " K_SOUP_COV_MIN_LINE: 100", + " K_SOUP_COV_MIN_HARD: true", + " K_SOUP_COV_FORMATTERS: \"xml,rcov,lcov,tty\"", + " K_SOUP_COV_DO: true", + " K_SOUP_COV_MULTI_FORMATTERS: true", + " K_SOUP_COV_COMMAND_NAME: \"Test Coverage\"", + "", + "on:", + " push:", + " branches:", + *github_actions_push_branches_yaml(content, default_branch: ci.fetch(:default_branch), indent: " ").lines(chomp: true), + " tags:", + " - \"!*\" # Do not execute on tags", + " pull_request:", + " branches:", + " - \"*\"", + " workflow_dispatch:", + "", + "concurrency:", + " group: \"${{ github.workflow }}-${{ github.ref }}\"", + " cancel-in-progress: true", + "", + "jobs:", + " coverage:", + " if: \"!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')\"", + " name: Code Coverage on ${{ matrix.ruby }}@current", + " runs-on: ubuntu-latest", + " continue-on-error: ${{ matrix.experimental || endsWith(matrix.ruby, 'head') }}", + " env:", + " BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile", + " strategy:", + " fail-fast: false", + " matrix:", + " include:", + " - ruby: \"ruby\"", + " appraisal: \"#{coverage.fetch(:appraisal)}\"", + " exec_cmd: \"#{coverage.fetch(:command)}\"", + " rubygems: latest", + " bundler: latest", + "", + " steps:", + " - name: Checkout", + " uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0", + "", + " - name: Setup Ruby & RubyGems", + " uses: ruby/setup-ruby@003a5c4d8d6321bd302e38f6f0ec593f77f06600 # v1.319.0", + " with:", + " ruby-version: \"${{ matrix.ruby }}\"", + " rubygems: \"${{ matrix.rubygems }}\"", + " bundler: \"${{ matrix.bundler }}\"", + " bundler-cache: true", + "", + " - name: \"[Attempt 1] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}\"", + " id: bundleAppraisalAttempt1", + " run: bundle exec appraisal ${{ matrix.appraisal }} install", + " continue-on-error: true", + "", + " - name: \"[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.appraisal }}\"", + " id: bundleAppraisalAttempt2", + " if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}", + " run: bundle exec appraisal ${{ matrix.appraisal }} install", + "", + *github_actions_rspec_status_cache_step( + cache_scope: "coverage", + key_parts: ["${{matrix.ruby}}", "${{matrix.appraisal}}"], + indent: " " + ).lines(chomp: true), + "", + " - name: Tests for ${{ matrix.ruby }}@current via ${{ matrix.exec_cmd }}", + " run: bundle exec appraisal ${{ matrix.appraisal }} bundle exec ${{ matrix.exec_cmd }}", + "", + " - name: Verify coverage reports", + " run: |", + " test -s coverage/lcov.info", + " test -s coverage/coverage.xml", + *coverage_steps.lines(chomp: true).map { |line| line.empty? ? line : " #{line}" } + ] + "#{lines.join("\n")}\n" +end
    @@ -50764,184 +67587,180 @@

    - .synchronize_github_actions_framework_ci(_content, facts) ⇒ Object - - - - - -

    - - - @@ -51342,14 +68161,14 @@

     
     
    -10646
    -10647
    -10648
    -10649
    -10650
    +13681 +13682 +13683 +13684 +13685

    @@ -52049,27 +68898,29 @@

     
     
    -7165
    -7166
    -7167
    -7168
    -7169
    -7170
    -7171
    -7172
    -7173
    -7174
    -7175
    -7176
    -7177
    -7178
    -7179
    -7180
    -7181
    -7182
    +9484 +9485 +9486 +9487 +9488 +9489 +9490 +9491 +9492 +9493 +9494 +9495 +9496 +9497 +9498 +9499 +9500 +9501 +9502 +9503

    - + - +
    -
    -
    -
    -11163
    -11164
    -11165
    -11166
    -11167
    -11168
    -11169
    -11170
    -11171
    -11172
    -11173
    -11174
    -11175
    -11176
    -11177
    -11178
    -11179
    -11180
    -11181
    -11182
    -11183
    -11184
    -11185
    -11186
    -11187
    -11188
    -11189
    -11190
    -11191
    -11192
    -11193
    -11194
    -11195
    -11196
    -11197
    -11198
    -11199
    -11200
    -11201
    -11202
    -11203
    -11204
    -11205
    -11206
    -11207
    -11208
    -11209
    -11210
    -11211
    -11212
    -11213
    -11214
    -11215
    -11216
    -11217
    -11218
    -11219
    -11220
    -11221
    -11222
    -11223
    -11224
    -11225
    -11226
    -11227
    -11228
    -11229
    -11230
    -11231
    -11232
    -11233
    -11234
    -11235
    -11236
    -11237
    -11238
    -11239
    -11240
    -11241
    -11242
    -11243
    -
    -
    # File 'lib/kettle/jem.rb', line 11163
    -
    -def synchronize_github_actions_framework_ci(_content, facts)
    +    .synchronize_github_actions_framework_ci(content, facts)  ⇒ Object 
    +  
    +
    +  
    +
    +  
    +
    +  
    +    
    +    
    +
    +
    +
    +14209
    +14210
    +14211
    +14212
    +14213
    +14214
    +14215
    +14216
    +14217
    +14218
    +14219
    +14220
    +14221
    +14222
    +14223
    +14224
    +14225
    +14226
    +14227
    +14228
    +14229
    +14230
    +14231
    +14232
    +14233
    +14234
    +14235
    +14236
    +14237
    +14238
    +14239
    +14240
    +14241
    +14242
    +14243
    +14244
    +14245
    +14246
    +14247
    +14248
    +14249
    +14250
    +14251
    +14252
    +14253
    +14254
    +14255
    +14256
    +14257
    +14258
    +14259
    +14260
    +14261
    +14262
    +14263
    +14264
    +14265
    +14266
    +14267
    +14268
    +14269
    +14270
    +14271
    +14272
    +14273
    +14274
    +14275
    +14276
    +14277
    +14278
    +14279
    +14280
    +14281
    +14282
    +14283
    +14284
    +14285
    +14286
    +14287
    +
    +
    # File 'lib/kettle/jem.rb', line 14209
    +
    +def synchronize_github_actions_framework_ci(content, facts)
       ci = facts.fetch(:ci)
       framework_matrix = ci.fetch(:framework_matrix)
    -  ruby_matrix = ci.fetch(:ruby_versions).map { |version| "          - \"#{version}\"" }.join("\n")
    -  framework_axis = framework_matrix.fetch(:include).map do |entry|
    +  dimension = framework_matrix.fetch(:dimension)
    +  label = dimension.split(/[-_]/).map { |part| part[0].to_s.upcase + part[1..].to_s }.join(" ")
    +  framework_axis = framework_matrix.fetch(:include).flat_map do |entry|
         [
           "          - framework_version: \"#{entry.fetch(:framework_version)}\"",
           "            appraisal: \"#{entry.fetch(:appraisal)}\""
    -    ].join("\n")
    -  end.join("\n")
    -  dimension = framework_matrix.fetch(:dimension)
    -  label = dimension.split(/[-_]/).map { |part| part[0].to_s.upcase + part[1..].to_s }.join(" ")
    -
    -  <<~YAML
    -    name: #{label} CI
    -
    -    permissions:
    -      contents: read
    -
    -    on:
    -      push:
    -        branches:
    -          - "#{ci.fetch(:default_branch)}"
    -          - "*-stable"
    -        tags:
    -          - "!*" # Do not execute on tags
    -      pull_request:
    -        branches:
    -          - "*"
    -      workflow_dispatch:
    -
    -    concurrency:
    -      group: "${{ github.workflow }}-${{ github.ref }}"
    -      cancel-in-progress: true
    -
    -    jobs:
    -      test:
    -        if: "!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')"
    -        name: Specs ${{ matrix.ruby }}@${{ matrix.framework.framework_version }}
    -        runs-on: ubuntu-latest
    -        continue-on-error: ${{ endsWith(matrix.ruby, 'head') }}
    -        env:
    -          BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile
    -        strategy:
    -          fail-fast: false
    -          matrix:
    -            ruby:
    -    #{ruby_matrix}
    -            rubygems:
    -              - default
    -            bundler:
    -              - default
    -            framework:
    -    #{framework_axis}
    -
    -        steps:
    -          - name: Checkout
    -            uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
    -
    -          - name: Setup Ruby & RubyGems
    -            uses: ruby/setup-ruby@89f90524b88a01fe6e0b732220432cc6142926af # v1.313.0
    -            with:
    -              ruby-version: "${{ matrix.ruby }}"
    -              rubygems: "${{ matrix.rubygems }}"
    -              bundler: "${{ matrix.bundler }}"
    -              bundler-cache: true
    -
    -          - name: "[Attempt 1] Appraisal for ${{ matrix.ruby }}@${{ matrix.framework.framework_version }}"
    -            id: bundleAppraisalAttempt1
    -            run: bundle exec appraisal ${{ matrix.framework.appraisal }} install
    -            continue-on-error: true
    -
    -          - name: "[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.framework.framework_version }}"
    -            id: bundleAppraisalAttempt2
    -            if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}
    -            run: bundle exec appraisal ${{ matrix.framework.appraisal }} install
    -
    -          - name: Tests for ${{ matrix.ruby }}@${{ matrix.framework.framework_version }}
    -            run: bundle exec appraisal ${{ matrix.framework.appraisal }} bundle exec #{ci.fetch(:exec_cmd)}
    -  YAML
    -end
    + ] + end + lines = [ + "name: #{label} CI", + "", + "permissions:", + " contents: read", + "", + "on:", + " push:", + " branches:", + *github_actions_push_branches_yaml(content, default_branch: ci.fetch(:default_branch), indent: " ").lines(chomp: true), + " tags:", + " - \"!*\" # Do not execute on tags", + " pull_request:", + " branches:", + " - \"*\"", + " workflow_dispatch:", + "", + "concurrency:", + " group: \"${{ github.workflow }}-${{ github.ref }}\"", + " cancel-in-progress: true", + "", + "jobs:", + " test:", + " if: \"!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')\"", + " name: Specs ${{ matrix.ruby }}@${{ matrix.framework.framework_version }}", + " runs-on: ubuntu-latest", + " continue-on-error: ${{ endsWith(matrix.ruby, 'head') }}", + " env:", + " BUNDLE_GEMFILE: ${{ github.workspace }}/Appraisal.root.gemfile", + " strategy:", + " fail-fast: false", + " matrix:", + " ruby:", + *ci.fetch(:ruby_versions).map { |version| " - \"#{version}\"" }, + " rubygems:", + " - default", + " bundler:", + " - default", + " framework:", + *framework_axis, + "", + " steps:", + " - name: Checkout", + " uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0", + "", + *github_actions_setup_ruby_steps(indent: " ").lines(chomp: true), + "", + " - name: \"[Attempt 1] Appraisal for ${{ matrix.ruby }}@${{ matrix.framework.framework_version }}\"", + " id: bundleAppraisalAttempt1", + " run: bundle exec appraisal ${{ matrix.framework.appraisal }} install", + " continue-on-error: true", + "", + " - name: \"[Attempt 2] Appraisal for ${{ matrix.ruby }}@${{ matrix.framework.framework_version }}\"", + " id: bundleAppraisalAttempt2", + " if: ${{ steps.bundleAppraisalAttempt1.outcome == 'failure' }}", + " run: bundle exec appraisal ${{ matrix.framework.appraisal }} install", + "", + *github_actions_rspec_status_cache_step( + cache_scope: "framework-ci", + key_parts: ["${{matrix.ruby}}", "${{matrix.framework.appraisal}}"], + indent: " " + ).lines(chomp: true), + "", + " - name: Tests for ${{ matrix.ruby }}@${{ matrix.framework.framework_version }}", + " run: bundle exec appraisal ${{ matrix.framework.appraisal }} bundle exec #{ci.fetch(:exec_cmd)}" + ] + "#{lines.join("\n")}\n" +end
    @@ -50985,28 +67804,28 @@

    -11245 -11246 -11247 -11248 -11249 -11250 -11251 -11252 -11253 -11254 -11255 -11256 -11257 -11258 -11259 -11260 -11261 -11262 -11263

    +14324 +14325 +14326 +14327 +14328 +14329 +14330 +14331 +14332 +14333 +14334 +14335 +14336 +14337 +14338 +14339 +14340 +14341 +14342
    -
    # File 'lib/kettle/jem.rb', line 11245
    +      
    # File 'lib/kettle/jem.rb', line 14324
     
     def synchronize_github_actions_framework_gemfile(target_path, facts)
       gemfile = facts.dig(:ci, :framework_matrix, :gemfiles).to_a.find do |entry|
    @@ -51035,7 +67854,7 @@ 

    - .synchronize_github_actions_workflow_snippets(content) ⇒ Object + .synchronize_github_actions_workflow_snippets(content, facts: {}) ⇒ Object @@ -51047,27 +67866,27 @@

    -11352 -11353 -11354 -11355 -11356 -11357 -11358 -11359 -11360 -11361 -11362 -11363 -11364 -11365 -11366 -11367

    +14438 +14439 +14440 +14441 +14442 +14443 +14444 +14445 +14446 +14447 +14448 +14449 +14450 +14451 +14452 +14453
    -
    # File 'lib/kettle/jem.rb', line 11352
    +      
    # File 'lib/kettle/jem.rb', line 14438
     
    -def synchronize_github_actions_workflow_snippets(content)
    +def synchronize_github_actions_workflow_snippets(content, facts: {})
       updated = ensure_workflow_top_level_section(
         content.to_s,
         "permissions",
    @@ -51080,7 +67899,7 @@ 

     
     
    -10920
    -10921
    -10922
    -10923
    -10924
    -10925
    -10926
    -10927
    -10928
    -10929
    -10930
    -10931
    +13968 +13969 +13970 +13971 +13972 +13973 +13974 +13975 +13976 +13977 +13978 +13979

    -
    # File 'lib/kettle/jem.rb', line 10920
    +      
    # File 'lib/kettle/jem.rb', line 13968
     
     def synchronize_github_funding_yml(content, facts)
       output = content.to_s
    @@ -51151,19 +67970,19 @@ 

     
     
    -3831
    -3832
    -3833
    -3834
    -3835
    -3836
    -3837
    -3838
    -3839
    -3840
    +4484 +4485 +4486 +4487 +4488 +4489 +4490 +4491 +4492 +4493

    -
    # File 'lib/kettle/jem.rb', line 3831
    +      
    # File 'lib/kettle/jem.rb', line 4484
     
     def synchronize_managed_block(content, facts)
       replacement = facts.dig(:generated_blocks, :shunted_gemfile) || [
    @@ -51195,23 +68014,23 @@ 

     
     
    -3631
    -3632
    -3633
    -3634
    -3635
    -3636
    -3637
    -3638
    -3639
    -3640
    -3641
    -3642
    -3643
    -3644
    +4205 +4206 +4207 +4208 +4209 +4210 +4211 +4212 +4213 +4214 +4215 +4216 +4217 +4218

    -
    # File 'lib/kettle/jem.rb', line 3631
    +      
    # File 'lib/kettle/jem.rb', line 4205
     
     def synchronize_readme(content, facts, project_root: nil)
       package = facts.fetch(:package)
    @@ -51247,15 +68066,15 @@ 

     
     
    -10216
    -10217
    -10218
    -10219
    -10220
    -10221
    +13184 +13185 +13186 +13187 +13188 +13189

    -
    # File 'lib/kettle/jem.rb', line 10216
    +      
    # File 'lib/kettle/jem.rb', line 13184
     
     def template_activation_config(config)
       return config["templates"] if config["templates"].is_a?(Hash)
    @@ -51283,21 +68102,21 @@ 

     
     
    -10229
    -10230
    -10231
    -10232
    -10233
    -10234
    +13197 +13198 +13199 +13200 +13201 +13202

    -
    # File 'lib/kettle/jem.rb', line 10229
    +      
    # File 'lib/kettle/jem.rb', line 13197
     
     def template_entries(project_root, root, templates)
       return templates["entries"] if templates["entries"].is_a?(Array)
       return [] if templates.key?("entries")
     
    -  template_inventory_entries(project_root, root.fetch(:path))
    +  template_inventory_entries(project_root, root.fetch(:path), templates: templates)
     end
    -
    # File 'lib/kettle/jem.rb', line 10646
    +      
    # File 'lib/kettle/jem.rb', line 13681
     
     def template_entry_apply?(entry, apply_templates)
       return entry["apply"] == true if entry.is_a?(Hash) && entry.key?("apply")
    @@ -51376,19 +68195,19 @@ 

     
     
    -10635
    -10636
    -10637
    -10638
    -10639
    -10640
    -10641
    -10642
    -10643
    -10644
    +13670 +13671 +13672 +13673 +13674 +13675 +13676 +13677 +13678 +13679

    -
    # File 'lib/kettle/jem.rb', line 10635
    +      
    # File 'lib/kettle/jem.rb', line 13670
     
     def template_entry_paths(entry)
       if entry.is_a?(Hash)
    @@ -51420,30 +68239,34 @@ 

     
     
    -10435
    -10436
    -10437
    -10438
    -10439
    -10440
    -10441
    -10442
    -10443
    -10444
    -10445
    -10446
    -10447
    -10448
    +13447 +13448 +13449 +13450 +13451 +13452 +13453 +13454 +13455 +13456 +13457 +13458 +13459 +13460 +13461 +13462

    -
    # File 'lib/kettle/jem.rb', line 10435
    +      
    # File 'lib/kettle/jem.rb', line 13447
     
     def template_file_strategy_config(config, target_path)
       files = config["files"]
       return unless files.is_a?(Hash)
     
       current = files
    -  target_path.to_s.delete_prefix("./").split("/").each do |part|
    +  parts = target_path.to_s.delete_prefix("./").split("/")
    +  until parts.empty?
    +    part = parts.shift
         return unless current.is_a?(Hash) && current.key?(part)
     
         current = current[part]
    @@ -51472,33 +68295,33 @@ 

     
     
    -6624
    -6625
    -6626
    -6627
    -6628
    -6629
    -6630
    -6631
    -6632
    -6633
    -6634
    -6635
    -6636
    -6637
    -6638
    -6639
    -6640
    -6641
    -6642
    -6643
    -6644
    -6645
    -6646
    -6647
    +8757 +8758 +8759 +8760 +8761 +8762 +8763 +8764 +8765 +8766 +8767 +8768 +8769 +8770 +8771 +8772 +8773 +8774 +8775 +8776 +8777 +8778 +8779 +8780

    -
    # File 'lib/kettle/jem.rb', line 6624
    +      
    # File 'lib/kettle/jem.rb', line 8757
     
     def template_file_type(recipe)
       configured = recipe.dig(:template_preference, :file_type).to_s
    @@ -51532,7 +68355,7 @@ 

    - .template_inventory_entries(project_root, template_root_path) ⇒ Object + .template_inventory_entries(project_root, template_root_path, templates: {}) ⇒ Object @@ -51544,36 +68367,40 @@

     
     
    -10236
    -10237
    -10238
    -10239
    -10240
    -10241
    -10242
    -10243
    -10244
    -10245
    -10246
    -10247
    -10248
    -10249
    -10250
    -10251
    -10252
    -10253
    -10254
    -10255
    -10256
    -10257
    -10258
    -10259
    +13221 +13222 +13223 +13224 +13225 +13226 +13227 +13228 +13229 +13230 +13231 +13232 +13233 +13234 +13235 +13236 +13237 +13238 +13239 +13240 +13241 +13242 +13243 +13244 +13245 +13246 +13247

    -
    # File 'lib/kettle/jem.rb', line 10236
    +      
    # File 'lib/kettle/jem.rb', line 13221
     
    -def template_inventory_entries(project_root, template_root_path)
    +def template_inventory_entries(project_root, template_root_path, templates: {})
       logical_paths = []
    +  include_shim_templates = normalize_template_profile(templates["profile"]) == SHIM_TEMPLATE_PROFILE
       Find.find(template_root_path) do |path|
         next if File.directory?(path)
     
    @@ -51582,7 +68409,9 @@ 

    .sub(/\.no-osc\.example\z/, "") .sub(/\.example\z/, "") next if logical_path.start_with?("readme/partials/") + next if logical_path.start_with?("shim/") && !include_shim_templates next if logical_path == "gemfiles/modular/shunted.gemfile" + next if logical_path == TRANSFER_CHANGELOG_TEMPLATE_PATH logical_paths << logical_path unless logical_path.empty? end @@ -51616,24 +68445,24 @@

     
     
    -10261
    -10262
    -10263
    -10264
    -10265
    -10266
    -10267
    -10268
    -10269
    -10270
    -10271
    -10272
    -10273
    -10274
    -10275
    +13249 +13250 +13251 +13252 +13253 +13254 +13255 +13256 +13257 +13258 +13259 +13260 +13261 +13262 +13263

    -
    # File 'lib/kettle/jem.rb', line 10261
    +      
    # File 'lib/kettle/jem.rb', line 13249
     
     def template_inventory_target_path(project_root, logical_path)
       return ".env.local.example" if logical_path == ".env.local"
    @@ -51693,13 +68522,13 @@ 

     
     
    -10798
    -10799
    -10800
    -10801
    +13833 +13834 +13835 +13836

    -
    # File 'lib/kettle/jem.rb', line 10798
    +      
    # File 'lib/kettle/jem.rb', line 13833
     
     def template_keep_destination_path?(config, target_path)
       strategy = template_file_strategy_config(config, target_path) || template_pattern_strategy_config(config, target_path)
    @@ -51725,23 +68554,23 @@ 

     
     
    -10401
    -10402
    -10403
    -10404
    -10405
    -10406
    -10407
    -10408
    -10409
    -10410
    -10411
    -10412
    -10413
    -10414
    +13413 +13414 +13415 +13416 +13417 +13418 +13419 +13420 +13421 +13422 +13423 +13424 +13425 +13426

    -
    # File 'lib/kettle/jem.rb', line 10401
    +      
    # File 'lib/kettle/jem.rb', line 13413
     
     def template_legacy_destination_cleanups(project_root, preferences)
       preferences.filter_map do |preference|
    @@ -51777,18 +68606,18 @@ 

     
     
    -1949
    -1950
    -1951
    -1952
    -1953
    -1954
    -1955
    -1956
    -1957
    +2127 +2128 +2129 +2130 +2131 +2132 +2133 +2134 +2135

    -
    # File 'lib/kettle/jem.rb', line 1949
    +      
    # File 'lib/kettle/jem.rb', line 2127
     
     def template_manifest(project_root: Dir.pwd, template_root: nil, config: nil)
       root = template_root || template_root_path(project_root, config: config)
    @@ -51819,23 +68648,23 @@ 

     
     
    -10416
    -10417
    -10418
    -10419
    -10420
    -10421
    -10422
    -10423
    -10424
    -10425
    -10426
    -10427
    -10428
    -10429
    +13428 +13429 +13430 +13431 +13432 +13433 +13434 +13435 +13436 +13437 +13438 +13439 +13440 +13441

    -
    # File 'lib/kettle/jem.rb', line 10416
    +      
    # File 'lib/kettle/jem.rb', line 13428
     
     def template_obsolete_license_cleanups(project_root, config, preferences)
       active_basenames = active_license_basenames(config)
    @@ -51871,21 +68700,21 @@ 

     
     
    -10450
    -10451
    -10452
    -10453
    -10454
    -10455
    -10456
    -10457
    -10458
    -10459
    -10460
    -10461
    +13464 +13465 +13466 +13467 +13468 +13469 +13470 +13471 +13472 +13473 +13474 +13475

    -
    # File 'lib/kettle/jem.rb', line 10450
    +      
    # File 'lib/kettle/jem.rb', line 13464
     
     def template_pattern_strategy_config(config, target_path)
       patterns = config["patterns"]
    @@ -51919,23 +68748,23 @@ 

     
     
    -10500
    -10501
    -10502
    -10503
    -10504
    -10505
    -10506
    -10507
    -10508
    -10509
    -10510
    -10511
    -10512
    -10513
    +13514 +13515 +13516 +13517 +13518 +13519 +13520 +13521 +13522 +13523 +13524 +13525 +13526 +13527

    -
    # File 'lib/kettle/jem.rb', line 10500
    +      
    # File 'lib/kettle/jem.rb', line 13514
     
     def template_root(project_root, templates)
       configured_root = templates["root"].to_s
    @@ -51971,15 +68800,15 @@ 

     
     
    -1942
    -1943
    -1944
    -1945
    -1946
    -1947
    +2120 +2121 +2122 +2123 +2124 +2125

    -
    # File 'lib/kettle/jem.rb', line 1942
    +      
    # File 'lib/kettle/jem.rb', line 2120
     
     def template_root_path(project_root = Dir.pwd, config: nil)
       root = File.expand_path(project_root.to_s)
    @@ -52007,18 +68836,28 @@ 

     
     
    -10206
    -10207
    -10208
    -10209
    -10210
    -10211
    -10212
    -10213
    -10214
    +13154 +13155 +13156 +13157 +13158 +13159 +13160 +13161 +13162 +13163 +13164 +13165 +13166 +13167 +13168 +13169 +13170 +13171 +13172

    -
    # File 'lib/kettle/jem.rb', line 10206
    +      
    # File 'lib/kettle/jem.rb', line 13154
     
     def template_runtime_config(config, facts, license: {})
       result = deep_dup(config)
    @@ -52027,6 +68866,16 @@ 

    result["ruby"] = {} unless result["ruby"].is_a?(Hash) result["ruby"]["test_minimum"] = config_test_min_ruby(result, facts.dig(:rubygems, :min_ruby)).to_s result["resolved_licenses"] = license[:spdx] + if facts[:template_profile].to_s == SHIM_TEMPLATE_PROFILE + result["templates"] = default_template_config.merge(result["templates"].is_a?(Hash) ? result["templates"] : {}) + result["templates"]["profile"] = SHIM_TEMPLATE_PROFILE + result["templates"]["entries"] = shim_template_entries(facts, result) + result["templates"]["entries"].each do |entry| + target = entry.fetch("target").to_s + + set_template_file_strategy!(result, target, "accept_template") + end + end result end

    -
    # File 'lib/kettle/jem.rb', line 7165
    +      
    # File 'lib/kettle/jem.rb', line 9484
     
     def template_selection_for(env, run_options)
       env_hash = env || {}
    @@ -52081,6 +68932,8 @@ 

    only: normalize_list_option(option_hash.fetch(:only, env_hash["only"])), include: normalize_list_option(option_hash.fetch(:include, env_hash["include"])), template_profile: normalize_template_profile(option_hash.fetch(:template_profile, env_hash["KETTLE_JEM_TEMPLATE_PROFILE"])), + shimmed_gem: option_hash.fetch(:shimmed_gem, env_hash["KETTLE_JEM_SHIMMED_GEM"]), + shimmed_require: option_hash.fetch(:shimmed_require, env_hash["KETTLE_JEM_SHIMMED_REQUIRE"]), skip_commit: DecisionPolicy.value_to_boolean(option_hash.fetch(:skip_commit, env_hash["KETTLE_JEM_SKIP_COMMIT"])), dry_run: DecisionPolicy.value_to_boolean(option_hash.fetch(:dry_run, env_hash["KETTLE_JEM_DRY_RUN"])), accept_config: DecisionPolicy.value_to_boolean(option_hash.fetch(:accept_config, env_hash["KETTLE_JEM_ACCEPT_CONFIG"])), @@ -52109,15 +68962,15 @@

     
     
    -10628
    -10629
    -10630
    -10631
    -10632
    -10633
    +13663 +13664 +13665 +13666 +13667 +13668

    -
    # File 'lib/kettle/jem.rb', line 10628
    +      
    # File 'lib/kettle/jem.rb', line 13663
     
     def template_source_display_path(template_root, selected_source)
       prefix = template_root[:display_prefix].to_s
    @@ -52145,58 +68998,59 @@ 

     
     
    -10351
    -10352
    -10353
    -10354
    -10355
    -10356
    -10357
    -10358
    -10359
    -10360
    -10361
    -10362
    -10363
    -10364
    -10365
    -10366
    -10367
    -10368
    -10369
    -10370
    -10371
    -10372
    -10373
    -10374
    -10375
    -10376
    -10377
    -10378
    -10379
    -10380
    -10381
    -10382
    -10383
    -10384
    -10385
    -10386
    -10387
    -10388
    -10389
    -10390
    -10391
    -10392
    -10393
    -10394
    -10395
    -10396
    -10397
    -10398
    -10399
    -

    -
    # File 'lib/kettle/jem.rb', line 10351
    +13362
    +13363
    +13364
    +13365
    +13366
    +13367
    +13368
    +13369
    +13370
    +13371
    +13372
    +13373
    +13374
    +13375
    +13376
    +13377
    +13378
    +13379
    +13380
    +13381
    +13382
    +13383
    +13384
    +13385
    +13386
    +13387
    +13388
    +13389
    +13390
    +13391
    +13392
    +13393
    +13394
    +13395
    +13396
    +13397
    +13398
    +13399
    +13400
    +13401
    +13402
    +13403
    +13404
    +13405
    +13406
    +13407
    +13408
    +13409
    +13410
    +13411
    +
    +
    # File 'lib/kettle/jem.rb', line 13362
     
     def template_source_preference(project_root, template_root, entry, config, opencollective_disabled: false, include_patterns: nil, apply_templates: false)
       source_path, target_path = template_entry_paths(entry)
    @@ -52206,6 +69060,7 @@ 

    end return if source_path.to_s.empty? || target_path.to_s.empty? return if skip_packaged_workflow_template?(target_path, config, include_patterns: include_patterns) + return if skip_disabled_integration_template?(target_path, config) return if skip_packaged_gemfile_template?(target_path, config) return if skip_packaged_license_template?(target_path, config) return if template_root.fetch(:kind) == "packaged" && opencollective_disabled && opencollective_disabled_file?(target_path) @@ -52267,30 +69122,30 @@

     
     
    -10184
    -10185
    -10186
    -10187
    -10188
    -10189
    -10190
    -10191
    -10192
    -10193
    -10194
    -10195
    -10196
    -10197
    -10198
    -10199
    -10200
    -10201
    -10202
    -10203
    -10204
    +13132 +13133 +13134 +13135 +13136 +13137 +13138 +13139 +13140 +13141 +13142 +13143 +13144 +13145 +13146 +13147 +13148 +13149 +13150 +13151 +13152

    -
    # File 'lib/kettle/jem.rb', line 10184
    +      
    # File 'lib/kettle/jem.rb', line 13132
     
     def template_source_preferences(project_root, config, opencollective_disabled: false, include_patterns: nil)
       templates = template_activation_config(config)
    @@ -52333,20 +69188,20 @@ 

     
     
    -10661
    -10662
    -10663
    -10664
    -10665
    -10666
    -10667
    -10668
    -10669
    -10670
    -10671
    +13696 +13697 +13698 +13699 +13700 +13701 +13702 +13703 +13704 +13705 +13706

    -
    # File 'lib/kettle/jem.rb', line 10661
    +      
    # File 'lib/kettle/jem.rb', line 13696
     
     def template_source_selection_reason(configured_source, selected_source)
       if selected_source.end_with?(".no-osc.example")
    @@ -52379,12 +69234,12 @@ 

     
     
    -10431
    -10432
    -10433
    +13443 +13444 +13445

    -
    # File 'lib/kettle/jem.rb', line 10431
    +      
    # File 'lib/kettle/jem.rb', line 13443
     
     def template_strategy_config(config, target_path)
       template_file_strategy_config(config, target_path) || template_pattern_strategy_config(config, target_path)
    @@ -52432,45 +69287,45 @@ 

     
     
    -10463
    -10464
    -10465
    -10466
    -10467
    -10468
    -10469
    -10470
    -10471
    -10472
    -10473
    -10474
    -10475
    -10476
    -10477
    -10478
    -10479
    -10480
    -10481
    -10482
    -10483
    -10484
    -10485
    -10486
    -10487
    -10488
    -10489
    -10490
    -10491
    -10492
    -10493
    -10494
    -10495
    -10496
    -10497
    -10498
    -

    -
    # File 'lib/kettle/jem.rb', line 10463
    +13477
    +13478
    +13479
    +13480
    +13481
    +13482
    +13483
    +13484
    +13485
    +13486
    +13487
    +13488
    +13489
    +13490
    +13491
    +13492
    +13493
    +13494
    +13495
    +13496
    +13497
    +13498
    +13499
    +13500
    +13501
    +13502
    +13503
    +13504
    +13505
    +13506
    +13507
    +13508
    +13509
    +13510
    +13511
    +13512
    +
    +
    # File 'lib/kettle/jem.rb', line 13477
     
     def template_strategy_entry(config, path, entry)
       strategy = entry["strategy"].to_s.strip.downcase.to_sym
    @@ -52528,62 +69383,67 @@ 

     
     
    -7951
    -7952
    -7953
    -7954
    -7955
    -7956
    -7957
    -7958
    -7959
    -7960
    -7961
    -7962
    -7963
    -7964
    -7965
    -7966
    -7967
    -7968
    -7969
    -7970
    -7971
    -7972
    -7973
    -7974
    -7975
    -7976
    -7977
    -7978
    -7979
    -7980
    -7981
    -7982
    -7983
    -7984
    -7985
    -7986
    -7987
    -7988
    -7989
    -7990
    -7991
    -7992
    -7993
    -7994
    -7995
    -7996
    -7997
    -7998
    -7999
    -8000
    -8001
    -8002
    -8003
    +10307 +10308 +10309 +10310 +10311 +10312 +10313 +10314 +10315 +10316 +10317 +10318 +10319 +10320 +10321 +10322 +10323 +10324 +10325 +10326 +10327 +10328 +10329 +10330 +10331 +10332 +10333 +10334 +10335 +10336 +10337 +10338 +10339 +10340 +10341 +10342 +10343 +10344 +10345 +10346 +10347 +10348 +10349 +10350 +10351 +10352 +10353 +10354 +10355 +10356 +10357 +10358 +10359 +10360 +10361 +10362 +10363 +10364

    -
    # File 'lib/kettle/jem.rb', line 7951
    +      
    # File 'lib/kettle/jem.rb', line 10307
     
     def template_tokens(facts, funding)
       package = facts.fetch(:package)
    @@ -52600,6 +69460,7 @@ 

    "KJ|GEM_NAME_PATH" => package.fetch(:name).to_s.tr("-", "/"), "KJ|ENTRYPOINT_REQUIRE" => rubygems.fetch(:entrypoint_require, package.fetch(:name).to_s.tr("-", "/")).to_s, "KJ|GEM_SHIELD" => shield_token(package.fetch(:name).to_s), + "KJ|GEM_VERSION" => facts.dig(:project_runtime, :version).to_s, "KJ|GEM_MAJOR" => gem_major_token(facts.fetch(:project_runtime, {})[:version]), "KJ|SECURITY:SUPPORTED_VERSION" => security_supported_version_token(facts.fetch(:project_runtime, {})[:version]), "KJ|GH_ORG" => github_org, @@ -52609,9 +69470,9 @@

    "KJ|MIN_DEV_RUBY" => facts.dig(:project_runtime, :test_min_ruby).to_s, "KJ|MIN_TEST_RUBY" => facts.dig(:project_runtime, :test_min_ruby).to_s, "KJ|CI:EXEC_CMD" => facts.dig(:ci, :exec_cmd).to_s, - "KJ|GITHUB_ACTIONS:COVERAGE_UPLOAD_STEPS" => github_actions_coverage_steps + "KJ|GITHUB_ACTIONS:COVERAGE_UPLOAD_STEPS" => github_actions_coverage_steps(disabled_integrations: facts.dig(:integrations, :disabled)) }.merge( - rubocop_template_tokens(rubygems[:min_ruby]) + rubocop_template_tokens(rubygems[:min_ruby], ruby_style: facts.fetch(:ruby_style, {})) ).merge( author_template_tokens(facts.fetch(:author, {})) ).merge( @@ -52622,6 +69483,8 @@

    social_template_tokens(facts.fetch(:social, {})) ).merge( license_template_tokens(facts.fetch(:license, {})) + ).merge( + gemspec_template_tokens(facts.fetch(:gemspec, {})) ).merge( project_runtime_template_tokens(facts.fetch(:project_runtime, {})) ).merge( @@ -52633,8 +69496,10 @@

    tokens["KJ|OPENCOLLECTIVE_ORG"] = org tokens["KJ|README:FAMILY_INTRO_BACKEND_MATRIX"] = readme_family_intro_and_backend_matrix(facts.fetch(:readme_style, {})) + tokens["KJ|README:DEV_TEST_STACK_TABLE"] = readme_dev_test_stack_table(package.fetch(:name).to_s) tokens.merge!(readme_fossa_template_tokens(facts.fetch(:readme_style, {}))) tokens.merge!(version_gem_template_tokens(facts)) + tokens.merge!(shim_template_tokens(facts.fetch(:shim, {}))) tokens.reject { |key, value| value.empty? && !EMPTY_TEMPLATE_TOKENS.include?(key) } end

    @@ -52658,37 +69523,43 @@

     
     
    -3327
    -3328
    -3329
    -3330
    -3331
    -3332
    -3333
    -3334
    -3335
    -3336
    -3337
    -3338
    -3339
    -3340
    -3341
    -3342
    -3343
    +3879 +3880 +3881 +3882 +3883 +3884 +3885 +3886 +3887 +3888 +3889 +3890 +3891 +3892 +3893 +3894 +3895 +3896 +3897 +3898

    -
    # File 'lib/kettle/jem.rb', line 3327
    +      
    # File 'lib/kettle/jem.rb', line 3879
     
     def template_version_gem_bootstrap_step(project_root, report)
       facts = report.fetch(:facts)
    -  return version_gem_cleanup_step(project_root, facts) unless version_gem_runtime_compatible?(facts)
    -  return unless project_gemspec_declares_version_gem?(project_root)
    -
       entrypoint_require = facts.dig(:rubygems, :entrypoint_require).to_s
       entrypoint_require = facts.dig(:package, :name).to_s.tr("-", "/") if entrypoint_require.empty?
    +  unless project_gemspec_declares_version_gem?(project_root)
    +    return legacy_rbs_consolidation_step(project_root, facts, entrypoint_require: entrypoint_require)
    +  end
    +
    +  return version_gem_cleanup_step(project_root, facts) unless version_gem_runtime_compatible?(facts)
    +
       templated_paths = report.fetch(:recipe_reports, []).map { |recipe_report| recipe_report.fetch(:relative_path, "") }
       version_path = File.join("lib", entrypoint_require, "version.rb")
    -  signature_path = File.join("sig", entrypoint_require, "version.rbs")
    +  signature_path = File.join("sig", "#{entrypoint_require}.rbs")
       version_gem_bootstrap_step_for_paths(
         project_root,
         facts,
    @@ -52699,6 +69570,50 @@ 

    +
    + +
    +

    + + .templating_guard_records(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +5754
    +5755
    +5756
    +5757
    +5758
    +5759
    +5760
    +5761
    +5762
    +5763
    +
    +
    # File 'lib/kettle/jem.rb', line 5754
    +
    +def templating_guard_records(content)
    +  result = prism_parse_success(content)
    +  return [] unless result
    +
    +  result.value.breadth_first_search_all do |node|
    +    gemfile_conditional_node?(node) && prism_subtree_contains_string?(node.predicate, "K_JEM_TEMPLATING")
    +  end.map do |node|
    +    {start_line: node.location.start_line, end_line: node.location.end_line}
    +  end
    +end
    +
    @@ -52716,13 +69631,13 @@

     
     
    -8189
    -8190
    -8191
    -8192
    +10629 +10630 +10631 +10632

    -
    # File 'lib/kettle/jem.rb', line 8189
    +      
    # File 'lib/kettle/jem.rb', line 10629
     
     def token_config_values(config)
       raw = config.is_a?(Hash) ? config["tokens"] : nil
    @@ -52771,12 +69686,12 @@ 

     
     
    -8210
    -8211
    -8212
    +10650 +10651 +10652

    -
    # File 'lib/kettle/jem.rb', line 8210
    +      
    # File 'lib/kettle/jem.rb', line 10650
     
     def token_placeholder?(value)
       value.to_s.strip.match?(%r{\A\{KJ\|[A-Z][A-Z0-9_:]*\}\z})
    @@ -52801,21 +69716,21 @@ 

     
     
    -4316
    -4317
    -4318
    -4319
    -4320
    -4321
    -4322
    -4323
    -4324
    -4325
    -4326
    -4327
    +5023 +5024 +5025 +5026 +5027 +5028 +5029 +5030 +5031 +5032 +5033 +5034

    -
    # File 'lib/kettle/jem.rb', line 4316
    +      
    # File 'lib/kettle/jem.rb', line 5023
     
     def toml_string_scalar_line_value(content, key)
       content.to_s.lines.each do |line|
    @@ -52849,15 +69764,15 @@ 

     
     
    -11068
    -11069
    -11070
    -11071
    -11072
    -11073
    +14116 +14117 +14118 +14119 +14120 +14121

    -
    # File 'lib/kettle/jem.rb', line 11068
    +      
    # File 'lib/kettle/jem.rb', line 14116
     
     def top_level_ruby_call_records(content, call_name)
       result = prism_parse_success(content)
    @@ -52908,14 +69823,14 @@ 

     
     
    -3233
    -3234
    -3235
    -3236
    -3237
    +3785 +3786 +3787 +3788 +3789

    -
    # File 'lib/kettle/jem.rb', line 3233
    +      
    # File 'lib/kettle/jem.rb', line 3785
     
     def top_level_yaml_key_line?(line)
       return false if line.to_s.empty? || line.start_with?("#") || line.start_with?(" ")
    @@ -52942,14 +69857,14 @@ 

     
     
    -8842
    -8843
    -8844
    -8845
    -8846
    +11607 +11608 +11609 +11610 +11611

    -
    # File 'lib/kettle/jem.rb', line 8842
    +      
    # File 'lib/kettle/jem.rb', line 11607
     
     def trim_trailing_blank_lines(content)
       lines = content.to_s.lines
    @@ -52959,6 +69874,59 @@ 

    +
    + +
    +

    + + .truthy_config?(value) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +12908
    +12909
    +12910
    +
    +
    # File 'lib/kettle/jem.rb', line 12908
    +
    +def truthy_config?(value)
    +  %w[true yes 1 on enabled].include?(value.to_s.strip.downcase)
    +end
    +
    @@ -52976,17 +69944,17 @@

     
     
    -5390
    -5391
    -5392
    -5393
    -5394
    -5395
    -5396
    -5397
    +6723 +6724 +6725 +6726 +6727 +6728 +6729 +6730

    -
    # File 'lib/kettle/jem.rb', line 5390
    +      
    # File 'lib/kettle/jem.rb', line 6723
     
     def uncomment_ruby_comment_line(comment_source)
       text = comment_source.to_s
    @@ -53039,15 +70007,15 @@ 

     
     
    -9962
    -9963
    -9964
    -9965
    -9966
    -9967
    +12893 +12894 +12895 +12896 +12897 +12898

    -
    # File 'lib/kettle/jem.rb', line 9962
    +      
    # File 'lib/kettle/jem.rb', line 12893
     
     def unresolved_template_scan?(recipe)
       return false if recipe.fetch(:target_path).to_s == KETTLE_CONFIG_PATH
    @@ -53075,30 +70043,30 @@ 

     
     
    -11494
    -11495
    -11496
    -11497
    -11498
    -11499
    -11500
    -11501
    -11502
    -11503
    -11504
    -11505
    -11506
    -11507
    -11508
    -11509
    -11510
    -11511
    -11512
    -11513
    -11514
    +14629 +14630 +14631 +14632 +14633 +14634 +14635 +14636 +14637 +14638 +14639 +14640 +14641 +14642 +14643 +14644 +14645 +14646 +14647 +14648 +14649

    -
    # File 'lib/kettle/jem.rb', line 11494
    +      
    # File 'lib/kettle/jem.rb', line 14629
     
     def update_github_actions_pins(content)
       lines = content.to_s.lines
    @@ -53164,18 +70132,18 @@ 

     
     
    -8157
    -8158
    -8159
    -8160
    -8161
    -8162
    -8163
    -8164
    -8165
    +10597 +10598 +10599 +10600 +10601 +10602 +10603 +10604 +10605

    -
    # File 'lib/kettle/jem.rb', line 8157
    +      
    # File 'lib/kettle/jem.rb', line 10597
     
     def valid_gem_version?(version)
       text = version.to_s
    @@ -53229,21 +70197,21 @@ 

     
     
    -7637
    -7638
    -7639
    -7640
    -7641
    -7642
    -7643
    -7644
    -7645
    -7646
    -7647
    -7648
    +9977 +9978 +9979 +9980 +9981 +9982 +9983 +9984 +9985 +9986 +9987 +9988

    -
    # File 'lib/kettle/jem.rb', line 7637
    +      
    # File 'lib/kettle/jem.rb', line 9977
     
     def validate_kettle_jem_config!(config)
       raise Error, "Invalid kettle-jem config: root must be a mapping" unless config.is_a?(Hash)
    @@ -53277,30 +70245,30 @@ 

    -8740 -8741 -8742 -8743 -8744 -8745 -8746 -8747 -8748 -8749 -8750 -8751 -8752 -8753 -8754 -8755 -8756 -8757 -8758 -8759 -8760

    +11503 +11504 +11505 +11506 +11507 +11508 +11509 +11510 +11511 +11512 +11513 +11514 +11515 +11516 +11517 +11518 +11519 +11520 +11521 +11522 +11523
    -
    # File 'lib/kettle/jem.rb', line 8740
    +      
    # File 'lib/kettle/jem.rb', line 11503
     
     def version_gem_bootstrap_entrypoint_content(content, namespace:, entrypoint_require:)
       current = content.to_s
    @@ -53343,12 +70311,12 @@ 

     
     
    -8640
    -8641
    -8642
    +11288 +11289 +11290

    -
    # File 'lib/kettle/jem.rb', line 8640
    +      
    # File 'lib/kettle/jem.rb', line 11288
     
     def version_gem_bootstrap_step(project_root, facts)
       version_gem_bootstrap_step_for_paths(project_root, facts)
    @@ -53373,56 +70341,69 @@ 

     
     
    -8644
    -8645
    -8646
    -8647
    -8648
    -8649
    -8650
    -8651
    -8652
    -8653
    -8654
    -8655
    -8656
    -8657
    -8658
    -8659
    -8660
    -8661
    -8662
    -8663
    -8664
    -8665
    -8666
    -8667
    -8668
    -8669
    -8670
    -8671
    -8672
    -8673
    -8674
    -8675
    -8676
    -8677
    -8678
    -8679
    -8680
    -8681
    -8682
    -8683
    -8684
    -8685
    -8686
    -8687
    -8688
    -8689
    -8690
    +11292 +11293 +11294 +11295 +11296 +11297 +11298 +11299 +11300 +11301 +11302 +11303 +11304 +11305 +11306 +11307 +11308 +11309 +11310 +11311 +11312 +11313 +11314 +11315 +11316 +11317 +11318 +11319 +11320 +11321 +11322 +11323 +11324 +11325 +11326 +11327 +11328 +11329 +11330 +11331 +11332 +11333 +11334 +11335 +11336 +11337 +11338 +11339 +11340 +11341 +11342 +11343 +11344 +11345 +11346 +11347 +11348 +11349 +11350 +11351

    -
    # File 'lib/kettle/jem.rb', line 8644
    +      
    # File 'lib/kettle/jem.rb', line 11292
     
     def version_gem_bootstrap_step_for_paths(project_root, facts, manage_version_file: true, manage_signature_file: true)
       package_name = facts.dig(:package, :name).to_s
    @@ -53432,8 +70413,9 @@ 

    entrypoint_require = package_name.tr("-", "/") if entrypoint_require.empty? version_path = File.join("lib", entrypoint_require, "version.rb") entrypoint_path = File.join("lib", "#{entrypoint_require}.rb") - signature_path = File.join("sig", entrypoint_require, "version.rbs") - root_signature_path = File.join("sig", "#{entrypoint_require}.rbs") + version_spec_path = File.join("spec", entrypoint_require, "version_spec.rb") + signature_path = File.join("sig", "#{entrypoint_require}.rbs") + legacy_signature_paths = legacy_rbs_signature_paths(project_root, entrypoint_require) namespace = facts.dig(:rubygems, :namespace).to_s namespace = existing_entrypoint_version_namespace(project_root, entrypoint_path) if namespace.empty? namespace = existing_version_namespace(project_root, version_path) if namespace.empty? @@ -53452,14 +70434,26 @@

    ) end current_entrypoint = read_project_file(project_root, entrypoint_path) - entrypoint_content = if current_entrypoint.empty? + non_default_version_gem = non_default_version_gem_entrypoint?(project_root, entrypoint_require) + entrypoint_content = if non_default_version_gem + version_gem_free_entrypoint_content(current_entrypoint, entrypoint_require: entrypoint_require) + elsif current_entrypoint.empty? version_gem_entrypoint_file_content(namespace: namespace, entrypoint_require: entrypoint_require) else version_gem_bootstrap_entrypoint_content(current_entrypoint, namespace: namespace, entrypoint_require: entrypoint_require) end changes << write_if_changed(project_root, entrypoint_path, entrypoint_content) - changes << write_if_changed(project_root, signature_path, version_gem_signature_file_content(namespace: namespace)) if manage_signature_file - changes << remove_legacy_version_signature_alias(project_root, root_signature_path) + changes << normalize_non_default_version_gem_version_spec(project_root, version_spec_path, entrypoint_require) if non_default_version_gem + if manage_signature_file || !legacy_signature_paths.empty? + changes.concat( + write_consolidated_version_signature( + project_root, + signature_path, + legacy_signature_paths, + namespace: namespace + ) + ) + end changed_files = changes.compact { @@ -53491,16 +70485,16 @@

     
     
    -8848
    -8849
    -8850
    -8851
    -8852
    -8853
    -8854
    +11613 +11614 +11615 +11616 +11617 +11618 +11619

    -
    # File 'lib/kettle/jem.rb', line 8848
    +      
    # File 'lib/kettle/jem.rb', line 11613
     
     def version_gem_class_eval_block(namespace)
       <<~RUBY
    @@ -53552,18 +70546,18 @@ 

     
     
    -8789
    -8790
    -8791
    -8792
    -8793
    -8794
    -8795
    -8796
    -8797
    +11552 +11553 +11554 +11555 +11556 +11557 +11558 +11559 +11560

    -
    # File 'lib/kettle/jem.rb', line 8789
    +      
    # File 'lib/kettle/jem.rb', line 11552
     
     def version_gem_class_eval_call?(call)
       call.receiver&.slice.to_s.end_with?("::Version") &&
    @@ -53594,28 +70588,28 @@ 

     
     
    -3345
    -3346
    -3347
    -3348
    -3349
    -3350
    -3351
    -3352
    -3353
    -3354
    -3355
    -3356
    -3357
    -3358
    -3359
    -3360
    -3361
    -3362
    -3363
    +3920 +3921 +3922 +3923 +3924 +3925 +3926 +3927 +3928 +3929 +3930 +3931 +3932 +3933 +3934 +3935 +3936 +3937 +3938

    -
    # File 'lib/kettle/jem.rb', line 3345
    +      
    # File 'lib/kettle/jem.rb', line 3920
     
     def version_gem_cleanup_step(project_root, facts)
       package_name = facts.dig(:package, :name).to_s
    @@ -53656,19 +70650,19 @@ 

     
     
    -8718
    -8719
    -8720
    -8721
    -8722
    -8723
    -8724
    -8725
    -8726
    -8727
    +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490

    -
    # File 'lib/kettle/jem.rb', line 8718
    +      
    # File 'lib/kettle/jem.rb', line 11481
     
     def version_gem_entrypoint_file_content(namespace:, entrypoint_require:)
       sections = ["# frozen_string_literal: true"]
    @@ -53683,6 +70677,42 @@ 

    +

    + +
    +

    + + .version_gem_facts_for_project(project_root, entrypoint_require) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +11358
    +11359
    +11360
    +11361
    +11362
    +11363
    +
    +
    # File 'lib/kettle/jem.rb', line 11358
    +
    +def version_gem_facts_for_project(project_root, entrypoint_require)
    +  version_gem_path = File.join("lib", entrypoint_require.to_s, "version_gem.rb")
    +  return {} unless File.file?(File.join(project_root, version_gem_path))
    +
    +  {non_default_entrypoint: true, entrypoint_path: version_gem_path}
    +end
    +
    @@ -53700,18 +70730,18 @@

     
     
    -8762
    -8763
    -8764
    -8765
    -8766
    -8767
    -8768
    -8769
    -8770
    +11525 +11526 +11527 +11528 +11529 +11530 +11531 +11532 +11533 -
    # File 'lib/kettle/jem.rb', line 8762
    +      
    # File 'lib/kettle/jem.rb', line 11525
     
     def version_gem_free_entrypoint_content(content, entrypoint_require:)
       current = remove_version_gem_entrypoint_references(content)
    @@ -53742,22 +70772,24 @@ 

     
     
    -8799
    -8800
    -8801
    -8802
    -8803
    -8804
    -8805
    -8806
    -8807
    -8808
    -8809
    +11562 +11563 +11564 +11565 +11566 +11567 +11568 +11569 +11570 +11571 +11572 +11573

    -
    # File 'lib/kettle/jem.rb', line 8799
    +      
    # File 'lib/kettle/jem.rb', line 11562
     
     def version_gem_require_insertion_index(content, after_version_gem: false)
    +  ensure_runtime_dependencies!
       context = Ast::Crispr::Ruby::Prism.document_context(content: content.to_s, source_label: "entrypoint.rb")
       owners = context.structural_owners(owner_scope: :top_level_statements)
       if after_version_gem
    @@ -53811,17 +70843,17 @@ 

     
     
    -6160
    -6161
    -6162
    -6163
    -6164
    -6165
    -6166
    -6167
    +7618 +7619 +7620 +7621 +7622 +7623 +7624 +7625

    -
    # File 'lib/kettle/jem.rb', line 6160
    +      
    # File 'lib/kettle/jem.rb', line 7618
     
     def version_gem_runtime_compatible?(facts)
       min_ruby = gemspec_runtime_floor_token(facts)
    @@ -53851,19 +70883,19 @@ 

     
     
    -8729
    -8730
    -8731
    -8732
    -8733
    -8734
    -8735
    -8736
    -8737
    -8738
    +11492 +11493 +11494 +11495 +11496 +11497 +11498 +11499 +11500 +11501

    -
    # File 'lib/kettle/jem.rb', line 8729
    +      
    # File 'lib/kettle/jem.rb', line 11492
     
     def version_gem_signature_file_content(namespace:)
       body = [
    @@ -53895,14 +70927,14 @@ 

     
     
    -7015
    -7016
    -7017
    -7018
    -7019
    +9297 +9298 +9299 +9300 +9301

    -
    # File 'lib/kettle/jem.rb', line 7015
    +      
    # File 'lib/kettle/jem.rb', line 9297
     
     def version_gem_template_entries(gemspec_path)
       VERSION_GEM_TEMPLATE_SOURCES.map do |source|
    @@ -53929,21 +70961,21 @@ 

     
     
    -7021
    -7022
    -7023
    -7024
    -7025
    -7026
    -7027
    -7028
    -7029
    -7030
    -7031
    -7032
    +9303 +9304 +9305 +9306 +9307 +9308 +9309 +9310 +9311 +9312 +9313 +9314

    -
    # File 'lib/kettle/jem.rb', line 7021
    +      
    # File 'lib/kettle/jem.rb', line 9303
     
     def version_gem_template_target_path(gemspec_path, source)
       package_name = File.basename(gemspec_path.to_s, ".gemspec")
    @@ -53951,8 +70983,8 @@ 

    case source when "lib/gem/version.rb" File.join("lib", entrypoint_require, "version.rb") - when "sig/gem/version.rbs" - File.join("sig", entrypoint_require, "version.rbs") + when "sig/gem.rbs" + File.join("sig", "#{entrypoint_require}.rbs") else source end @@ -54000,13 +71032,13 @@

     
     
    -10293
    -10294
    -10295
    -10296
    +13281 +13282 +13283 +13284

    -
    # File 'lib/kettle/jem.rb', line 10293
    +      
    # File 'lib/kettle/jem.rb', line 13281
     
     def version_gem_template_target_path?(target_path)
       target = target_path.to_s
    @@ -54032,23 +71064,23 @@ 

    -7034 -7035 -7036 -7037 -7038 -7039 -7040 -7041 -7042 -7043 -7044 -7045 -7046 -7047

    +9316 +9317 +9318 +9319 +9320 +9321 +9322 +9323 +9324 +9325 +9326 +9327 +9328 +9329
    -
    # File 'lib/kettle/jem.rb', line 7034
    +      
    # File 'lib/kettle/jem.rb', line 9316
     
     def version_gem_template_target_path_for_project(project_root, gemspec_path, source)
       config = kettle_jem_config(project_root)
    @@ -54058,8 +71090,8 @@ 

     
     
    -8101
    -8102
    -8103
    -8104
    -8105
    -8106
    -8107
    -8108
    -8109
    -8110
    -8111
    +10497 +10498 +10499 +10500 +10501 +10502 +10503 +10504 +10505 +10506 +10507 +10508 +10509 +10510 +10511 +10512 +10513 +10514 +10515 +10516 +10517 +10518

    -
    # File 'lib/kettle/jem.rb', line 8101
    +      
    # File 'lib/kettle/jem.rb', line 10497
     
     def version_gem_template_tokens(facts)
       namespace = facts.dig(:rubygems, :namespace).to_s
    @@ -54105,8 +71148,19 @@ 

    version = "0.0.1.pre" if version.empty? return {} if namespace.empty? + version_rb = if facts.dig(:shim, :version_strategy).to_s == "shim" + shim_version_file_content( + namespace: namespace, + replacement_namespace: shim_replacement_namespace(facts.dig(:shim, :replacement_require)), + replacement_require: facts.dig(:shim, :replacement_require) + ) + else + version_gem_version_file_content(existing_version: "", namespace: namespace, version: version) + end + { - "KJ|VERSION_GEM:VERSION_RB" => version_gem_version_file_content(existing_version: "", namespace: namespace, version: version).chomp, + "KJ|GEM_VERSION" => version, + "KJ|VERSION_GEM:VERSION_RB" => version_rb.chomp, "KJ|VERSION_GEM:VERSION_RBS" => version_gem_signature_file_content(namespace: namespace).chomp } end

    @@ -54130,24 +71184,24 @@

     
     
    -8702
    -8703
    -8704
    -8705
    -8706
    -8707
    -8708
    -8709
    -8710
    -8711
    -8712
    -8713
    -8714
    -8715
    -8716
    +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479

    -
    # File 'lib/kettle/jem.rb', line 8702
    +      
    # File 'lib/kettle/jem.rb', line 11465
     
     def version_gem_version_file_content(existing_version:, namespace:, version:)
       resolved_version = existing_version.to_s.empty? ? version.to_s : existing_version.to_s
    @@ -54167,6 +71221,48 @@ 

    +

    + +
    +

    + + .version_spec_require_insertion_index(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +11455
    +11456
    +11457
    +11458
    +11459
    +11460
    +11461
    +11462
    +11463
    +
    +
    # File 'lib/kettle/jem.rb', line 11455
    +
    +def version_spec_require_insertion_index(content)
    +  ensure_runtime_dependencies!
    +  context = Ast::Crispr::Ruby::Prism.document_context(content: content.to_s, source_label: "version_spec.rb")
    +  owners = context.structural_owners(owner_scope: :top_level_statements)
    +  requires = owners.select { |owner| owner.is_a?(::Prism::CallNode) && owner.name == :require }
    +  return requires.last.location.end_line if requires.any?
    +
    +  version_gem_require_insertion_index(content)
    +end
    +
    @@ -54184,18 +71280,18 @@

     
     
    -4866
    -4867
    -4868
    -4869
    -4870
    -4871
    -4872
    -4873
    -4874
    +6163 +6164 +6165 +6166 +6167 +6168 +6169 +6170 +6171 -
    # File 'lib/kettle/jem.rb', line 4866
    +      
    # File 'lib/kettle/jem.rb', line 6163
     
     def versioned_gem_name_parts(name)
       match = name.to_s.match(/\A(.+?)(\d+(?:[_-]\d+)*)\z/)
    @@ -54249,18 +71345,18 @@ 

     
     
    -4856
    -4857
    -4858
    -4859
    -4860
    -4861
    -4862
    -4863
    -4864
    +6153 +6154 +6155 +6156 +6157 +6158 +6159 +6160 +6161

    -
    # File 'lib/kettle/jem.rb', line 4856
    +      
    # File 'lib/kettle/jem.rb', line 6153
     
     def versioned_gem_name_update_candidate?(destination_name, template_name)
       destination = versioned_gem_name_parts(destination_name)
    @@ -54274,6 +71370,62 @@ 

    +

    + +
    +

    + + .with_event_phase(events, phase, payload = {}) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3519
    +3520
    +3521
    +3522
    +3523
    +3524
    +3525
    +3526
    +3527
    +3528
    +3529
    +3530
    +3531
    +3532
    +3533
    +3534
    +
    +
    # File 'lib/kettle/jem.rb', line 3519
    +
    +def with_event_phase(events, phase, payload = {})
    +  emit_phase_event(events, phase, status: "started", **payload)
    +  result = yield
    +  emit_phase_event(events, phase, status: "ok", **payload)
    +  result
    +rescue => error
    +  emit_phase_event(
    +    events,
    +    phase,
    +    status: "failed",
    +    error_class: error.class.name,
    +    error_message: error.message,
    +    **payload
    +  )
    +  raise
    +end
    +
    @@ -54291,24 +71443,24 @@

     
     
    -5008
    -5009
    -5010
    -5011
    -5012
    -5013
    -5014
    -5015
    -5016
    -5017
    -5018
    -5019
    -5020
    -5021
    -5022
    +6305 +6306 +6307 +6308 +6309 +6310 +6311 +6312 +6313 +6314 +6315 +6316 +6317 +6318 +6319 -
    # File 'lib/kettle/jem.rb', line 5008
    +      
    # File 'lib/kettle/jem.rb', line 6305
     
     def workflow_job_env_existing_keys(lines, bundle_index, indent_length)
       existing = Set.new
    @@ -54345,17 +71497,17 @@ 

     
     
    -4978
    -4979
    -4980
    -4981
    -4982
    -4983
    -4984
    -4985
    +6275 +6276 +6277 +6278 +6279 +6280 +6281 +6282

    -
    # File 'lib/kettle/jem.rb', line 4978
    +      
    # File 'lib/kettle/jem.rb', line 6275
     
     def workflow_matrix_env_indent(lines, mapping)
       ((mapping.start_line - 1)...mapping.end_line).each do |index|
    @@ -54385,15 +71537,15 @@ 

     
     
    -4971
    -4972
    -4973
    -4974
    -4975
    -4976
    +6268 +6269 +6270 +6271 +6272 +6273

    -
    # File 'lib/kettle/jem.rb', line 4971
    +      
    # File 'lib/kettle/jem.rb', line 6268
     
     def workflow_matrix_env_insert_index(lines, mapping)
       ((mapping.start_line - 1)...mapping.end_line).each do |index|
    @@ -54421,12 +71573,12 @@ 

     
     
    -7610
    -7611
    -7612
    +9933 +9934 +9935

    -
    # File 'lib/kettle/jem.rb', line 7610
    +      
    # File 'lib/kettle/jem.rb', line 9933
     
     def workflow_recipe_slug(workflow_path)
       workflow_path.gsub(/[^a-zA-Z0-9]+/, "_").gsub(/\A_+|_+\z/, "")
    @@ -54451,19 +71603,19 @@ 

     
     
    -8856
    -8857
    -8858
    -8859
    -8860
    -8861
    -8862
    -8863
    -8864
    -8865
    +11621 +11622 +11623 +11624 +11625 +11626 +11627 +11628 +11629 +11630

    -
    # File 'lib/kettle/jem.rb', line 8856
    +      
    # File 'lib/kettle/jem.rb', line 11621
     
     def wrap_ruby_namespace(namespace, body_lines)
       segments = namespace.to_s.split("::").reject(&:empty?)
    @@ -54478,6 +71630,60 @@ 

    +

    + +
    +

    + + .write_consolidated_version_signature(project_root, signature_path, legacy_signature_paths, namespace:) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +11406
    +11407
    +11408
    +11409
    +11410
    +11411
    +11412
    +11413
    +11414
    +11415
    +11416
    +11417
    +11418
    +11419
    +11420
    +
    +
    # File 'lib/kettle/jem.rb', line 11406
    +
    +def write_consolidated_version_signature(project_root, signature_path, legacy_signature_paths, namespace:)
    +  template = version_gem_signature_file_content(namespace: namespace)
    +  current = read_project_file(project_root, signature_path)
    +  merged = current
    +  legacy_signature_paths.each do |legacy_signature_path|
    +    legacy = read_project_file(project_root, legacy_signature_path)
    +    merged = merge_rbs_signature_sources(legacy, merged) unless legacy.empty?
    +  end
    +  merged = merge_rbs_signature_sources(template, merged)
    +
    +  [
    +    write_if_changed(project_root, signature_path, merged),
    +    legacy_signature_paths.map { |legacy_signature_path| delete_project_file(project_root, legacy_signature_path) }
    +  ].flatten.compact
    +end
    +
    @@ -54495,18 +71701,18 @@

     
     
    -8934
    -8935
    -8936
    -8937
    -8938
    -8939
    -8940
    -8941
    -8942
    +11732 +11733 +11734 +11735 +11736 +11737 +11738 +11739 +11740 -
    # File 'lib/kettle/jem.rb', line 8934
    +      
    # File 'lib/kettle/jem.rb', line 11732
     
     def write_if_changed(project_root, relative_path, content)
       path = File.join(project_root, relative_path)
    @@ -54537,16 +71743,16 @@ 

     
     
    -6868
    -6869
    -6870
    -6871
    -6872
    -6873
    -6874
    +9098 +9099 +9100 +9101 +9102 +9103 +9104

    -
    # File 'lib/kettle/jem.rb', line 6868
    +      
    # File 'lib/kettle/jem.rb', line 9098
     
     def yaml_config_scalar_literal(value, path:)
       clean = value.to_s.strip
    @@ -54598,22 +71804,22 @@ 

     
     
    -11375
    -11376
    -11377
    -11378
    -11379
    -11380
    -11381
    -11382
    -11383
    -11384
    -11385
    -11386
    -11387
    +14492 +14493 +14494 +14495 +14496 +14497 +14498 +14499 +14500 +14501 +14502 +14503 +14504

    -
    # File 'lib/kettle/jem.rb', line 11375
    +      
    # File 'lib/kettle/jem.rb', line 14492
     
     def yaml_contains_key_value?(node, key, value)
       case node
    @@ -54648,12 +71854,12 @@ 

     
     
    -4987
    -4988
    -4989
    +6284 +6285 +6286

    -
    # File 'lib/kettle/jem.rb', line 4987
    +      
    # File 'lib/kettle/jem.rb', line 6284
     
     def yaml_double_quoted_scalar(value)
       %("#{value.to_s.gsub("\\", "\\\\\\").gsub('"', '\"')}")
    @@ -54678,47 +71884,47 @@ 

     
     
    -6829
    -6830
    -6831
    -6832
    -6833
    -6834
    -6835
    -6836
    -6837
    -6838
    -6839
    -6840
    -6841
    -6842
    -6843
    -6844
    -6845
    -6846
    -6847
    -6848
    -6849
    -6850
    -6851
    -6852
    -6853
    -6854
    -6855
    -6856
    -6857
    -6858
    -6859
    -6860
    -6861
    -6862
    -6863
    -6864
    -6865
    -6866
    +9059 +9060 +9061 +9062 +9063 +9064 +9065 +9066 +9067 +9068 +9069 +9070 +9071 +9072 +9073 +9074 +9075 +9076 +9077 +9078 +9079 +9080 +9081 +9082 +9083 +9084 +9085 +9086 +9087 +9088 +9089 +9090 +9091 +9092 +9093 +9094 +9095 +9096

    -
    # File 'lib/kettle/jem.rb', line 6829
    +      
    # File 'lib/kettle/jem.rb', line 9059
     
     def yaml_line_comment_suffix(line, key_index)
       value_start = line.to_s.index(":", key_index).to_i + 1
    @@ -54778,20 +71984,20 @@ 

     
     
    -5024
    -5025
    -5026
    -5027
    -5028
    -5029
    -5030
    -5031
    -5032
    -5033
    -5034
    +6321 +6322 +6323 +6324 +6325 +6326 +6327 +6328 +6329 +6330 +6331

    -
    # File 'lib/kettle/jem.rb', line 5024
    +      
    # File 'lib/kettle/jem.rb', line 6321
     
     def yaml_mapping_nodes(content)
       root = Psych.parse_stream(content.to_s)
    @@ -54807,6 +72013,46 @@ 

    +

    + +
    +

    + + .yaml_mapping_path_entries(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14772
    +14773
    +14774
    +14775
    +14776
    +14777
    +14778
    +14779
    +
    +
    # File 'lib/kettle/jem.rb', line 14772
    +
    +def yaml_mapping_path_entries(content)
    +  document = Psych.parse_stream(content.to_s)
    +  entries = []
    +  document.children.each { |node| collect_yaml_mapping_path_entries(node, [], entries) }
    +  entries
    +rescue Psych::Exception
    +  []
    +end
    +
    @@ -54824,18 +72070,18 @@

     
     
    -5046
    -5047
    -5048
    -5049
    -5050
    -5051
    -5052
    -5053
    -5054
    +6343 +6344 +6345 +6346 +6347 +6348 +6349 +6350 +6351 -
    # File 'lib/kettle/jem.rb', line 5046
    +      
    # File 'lib/kettle/jem.rb', line 6343
     
     def yaml_mapping_scalar_value(mapping, key)
       mapping.children.each_slice(2) do |key_node, value_node|
    @@ -54866,19 +72112,19 @@ 

     
     
    -11551
    -11552
    -11553
    -11554
    -11555
    -11556
    -11557
    -11558
    -11559
    -11560
    +14826 +14827 +14828 +14829 +14830 +14831 +14832 +14833 +14834 +14835

    -
    # File 'lib/kettle/jem.rb', line 11551
    +      
    # File 'lib/kettle/jem.rb', line 14826
     
     def yaml_mapping_value_node(content, key, node_class)
       yaml_mapping_nodes(content).each do |mapping|
    @@ -54910,25 +72156,25 @@ 

     
     
    -5731
    -5732
    -5733
    -5734
    -5735
    -5736
    -5737
    -5738
    -5739
    -5740
    -5741
    -5742
    -5743
    -5744
    -5745
    -5746
    +7135 +7136 +7137 +7138 +7139 +7140 +7141 +7142 +7143 +7144 +7145 +7146 +7147 +7148 +7149 +7150

    -
    # File 'lib/kettle/jem.rb', line 5731
    +      
    # File 'lib/kettle/jem.rb', line 7135
     
     def yaml_merge_options(recipe)
       options = {
    @@ -54989,12 +72235,12 @@ 

     
     
    -5076
    -5077
    -5078
    +6373 +6374 +6375

    -
    # File 'lib/kettle/jem.rb', line 5076
    +      
    # File 'lib/kettle/jem.rb', line 6373
     
     def yaml_process_result_adapter_failure?(merge_result)
       process_result_adapter_failure?(merge_result)
    @@ -55019,20 +72265,20 @@ 

     
     
    -6691
    -6692
    -6693
    -6694
    -6695
    -6696
    -6697
    -6698
    -6699
    -6700
    -6701
    +8825 +8826 +8827 +8828 +8829 +8830 +8831 +8832 +8833 +8834 +8835

    -
    # File 'lib/kettle/jem.rb', line 6691
    +      
    # File 'lib/kettle/jem.rb', line 8825
     
     def yaml_scalar_line_value(content, key)
       lines = content.to_s.lines
    @@ -55065,16 +72311,16 @@ 

     
     
    -11516
    -11517
    -11518
    -11519
    -11520
    -11521
    -11522
    +14755 +14756 +14757 +14758 +14759 +14760 +14761

    -
    # File 'lib/kettle/jem.rb', line 11516
    +      
    # File 'lib/kettle/jem.rb', line 14755
     
     def yaml_scalar_pairs(content)
       yaml_mapping_nodes(content).flat_map do |mapping|
    @@ -55103,17 +72349,17 @@ 

     
     
    -11524
    -11525
    -11526
    -11527
    -11528
    -11529
    -11530
    -11531
    +14763 +14764 +14765 +14766 +14767 +14768 +14769 +14770

    -
    # File 'lib/kettle/jem.rb', line 11524
    +      
    # File 'lib/kettle/jem.rb', line 14763
     
     def yaml_scalar_path_entries(content)
       document = Psych.parse_stream(content.to_s)
    @@ -55126,6 +72372,66 @@ 

    +

    + +
    +

    + + .yaml_scalar_sequence_at_path(content, path) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +14467
    +14468
    +14469
    +14470
    +14471
    +14472
    +14473
    +14474
    +14475
    +14476
    +14477
    +14478
    +14479
    +14480
    +14481
    +14482
    +14483
    +14484
    +
    +
    # File 'lib/kettle/jem.rb', line 14467
    +
    +def yaml_scalar_sequence_at_path(content, path)
    +  document = Psych.parse_stream(content.to_s).children.first
    +  node = path.reduce(document&.root) do |current, key|
    +    break nil unless current.is_a?(Psych::Nodes::Mapping)
    +
    +    pair = current.children.each_slice(2).find do |key_node, _value_node|
    +      key_node.is_a?(Psych::Nodes::Scalar) && key_node.value.to_s == key.to_s
    +    end
    +    pair&.last
    +  end
    +  return [] unless node.is_a?(Psych::Nodes::Sequence)
    +
    +  node.children.filter_map do |child|
    +    child.value.to_s if child.is_a?(Psych::Nodes::Scalar)
    +  end
    +rescue Psych::Exception
    +  []
    +end
    +
    @@ -55143,22 +72449,22 @@

     
     
    -11480
    -11481
    -11482
    -11483
    -11484
    -11485
    -11486
    -11487
    -11488
    -11489
    -11490
    -11491
    -11492
    +14615 +14616 +14617 +14618 +14619 +14620 +14621 +14622 +14623 +14624 +14625 +14626 +14627 -
    # File 'lib/kettle/jem.rb', line 11480
    +      
    # File 'lib/kettle/jem.rb', line 14615
     
     def yaml_top_level_key_lines(content)
       document = Psych.parse_stream(content.to_s).children.first
    @@ -55183,9 +72489,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/CLI.html b/gems/kettle-jem/docs/Kettle/Jem/CLI.html index ba118ad5a..3f5842996 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/CLI.html +++ b/gems/kettle-jem/docs/Kettle/Jem/CLI.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::CLI - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -102,11 +102,11 @@

    Usage: kettle-jem [PROJECT_ROOT] [--accept-config] [--bootstrap-mode] [--quiet|--verbose] kettle-jem setup [PROJECT_ROOT] [--accept-config] [--bootstrap-mode] [--quiet|--verbose] - kettle-jem prepare [PROJECT_ROOT] [--json] [--report PATH] [--accept|--force] [--quiet|--verbose] - kettle-jem plan [PROJECT_ROOT] [--json] [--report PATH] [--accept|--force|--interactive] [--failure-mode MODE] [--prompt-answer ID=ACTION] - kettle-jem apply [PROJECT_ROOT] [--json] [--report PATH] [--accept|--force|--interactive] [--failure-mode MODE] [--prompt-answer ID=ACTION] - kettle-jem template [PROJECT_ROOT] [--json] [--report PATH] [--accept|--force|--interactive] [--failure-mode MODE] [--prompt-answer ID=ACTION] - kettle-jem install [PROJECT_ROOT] [--json] [--report PATH] [--accept|--force|--interactive] [--failure-mode MODE] [--prompt-answer ID=ACTION] + kettle-jem prepare [PROJECT_ROOT] [--json|--events[=TYPE,...]] [--report PATH] [--accept|--force] [--quiet|--verbose] + kettle-jem plan [PROJECT_ROOT] [--json|--events[=TYPE,...]] [--report PATH] [--accept|--force|--interactive] [--failure-mode MODE] [--prompt-answer ID=ACTION] + kettle-jem apply [PROJECT_ROOT] [--json|--events[=TYPE,...]] [--report PATH] [--accept|--force|--interactive] [--failure-mode MODE] [--prompt-answer ID=ACTION] + kettle-jem template [PROJECT_ROOT] [--json|--events[=TYPE,...]] [--report PATH] [--accept|--force|--interactive] [--failure-mode MODE] [--prompt-answer ID=ACTION] + kettle-jem install [PROJECT_ROOT] [--json|--events[=TYPE,...]] [--report PATH] [--accept|--force|--interactive] [--failure-mode MODE] [--prompt-answer ID=ACTION] kettle-jem manifest [PROJECT_ROOT] [--json] kettle-jem selftest [PROJECT_ROOT] [--json] [--report PATH] [--destination PATH] [--template-root PATH] [--selftest-output PATH] kettle-jem version @@ -132,6 +132,29 @@

  • + .canonical_path(path) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + .command_allowed?(command) ⇒ Boolean @@ -169,6 +192,29 @@

    +
    +
    + +

  • + + +
  • + + + .ensure_not_running_from_own_context!(command, project_root) ⇒ Object + + + + + + + + + + + + +
    @@ -462,7 +508,41 @@

    Class Method Details

    -

    +

    + + .canonical_path(path) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +234
    +235
    +236
    +237
    +238
    +
    +
    # File 'lib/kettle/jem/cli.rb', line 234
    +
    +def canonical_path(path)
    +  File.realpath(path)
    +rescue Errno::ENOENT
    +  File.expand_path(path)
    +end
    +
    +
    + +
    +

    .command_allowed?(command) ⇒ Boolean @@ -499,12 +579,12 @@

     
     
    -64
    -65
    -66
    +66 +67 +68 -
    # File 'lib/kettle/jem/cli.rb', line 64
    +      
    # File 'lib/kettle/jem/cli.rb', line 66
     
     def command_allowed?(command)
       %w[setup prepare plan apply template install manifest selftest help version].include?(command)
    @@ -552,12 +632,12 @@ 

     
     
    -248
    -249
    -250
    +291 +292 +293

    -
    # File 'lib/kettle/jem/cli.rb', line 248
    +      
    # File 'lib/kettle/jem/cli.rb', line 291
     
     def debug_enabled?(env)
       %w[DEBUG KETTLE_JEM_DEBUG KETTLE_DEV_DEBUG].any? { |key| env_true?(env_value(env, key)) }
    @@ -565,6 +645,77 @@ 

    +

    + +
    +

    + + .ensure_not_running_from_own_context!(command, project_root) ⇒ Object + + + + + +

    +
    + + + +
    +
    +
    + +

    Raises:

    +
      + +
    • + + + (ArgumentError) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
    +
    +
    # File 'lib/kettle/jem/cli.rb', line 221
    +
    +def ensure_not_running_from_own_context!(command, project_root)
    +  return if %w[help version].include?(command)
    +
    +  current_root = canonical_path(Dir.pwd)
    +  own_root = canonical_path(File.expand_path("../../..", __dir__))
    +  target_root = canonical_path(project_root)
    +  return unless current_root == own_root && target_root != own_root
    +
    +  raise ArgumentError,
    +    "Refusing to run kettle-jem from its own project root against #{project_root}; " \
    +    "run from the destination repository so its environment is loaded, or target kettle-jem itself."
    +end
    +
    @@ -605,12 +756,12 @@

     
     
    -252
    -253
    -254
    +295 +296 +297 -
    # File 'lib/kettle/jem/cli.rb', line 252
    +      
    # File 'lib/kettle/jem/cli.rb', line 295
     
     def env_true?(value)
       /\A(?:true|t|yes|y|on|1)\z/i.match?(value.to_s.strip)
    @@ -635,14 +786,14 @@ 

     
     
    -256
    -257
    -258
    -259
    -260
    +299 +300 +301 +302 +303

    -
    # File 'lib/kettle/jem/cli.rb', line 256
    +      
    # File 'lib/kettle/jem/cli.rb', line 299
     
     def env_value(env, key)
       env.fetch(key, nil)
    @@ -669,20 +820,6 @@ 

     
     
    -162
    -163
    -164
    -165
    -166
    -167
    -168
    -169
    -170
    -171
    -172
    -173
    -174
    -175
     176
     177
     178
    @@ -701,30 +838,56 @@ 

    191 192 193 -194

    +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214

    -
    # File 'lib/kettle/jem/cli.rb', line 162
    +      
    # File 'lib/kettle/jem/cli.rb', line 176
     
     def execute(command, project_root:, env:, options:)
    +  run_options = options.fetch(:run_options)
    +  if options[:events]
    +    run_options[:event_stream] = Kettle::Jem.event_stream(
    +      options.fetch(:event_io),
    +      types: options[:event_types]
    +    )
    +  end
       case command
       when "setup"
    -    Kettle::Jem.setup_project(project_root, env: env, run_options: options.fetch(:run_options))
    +    Kettle::Jem.setup_project(project_root, env: env, run_options: run_options)
       when "prepare"
    -    Kettle::Jem::Tasks::PrepareTask.run(project_root: project_root, env: env, run_options: options.fetch(:run_options))
    +    Kettle::Jem::Tasks::PrepareTask.run(project_root: project_root, env: env, run_options: run_options)
       when "plan"
    -    Kettle::Jem.plan_project(project_root, env: env, run_options: options.fetch(:run_options))
    +    Kettle::Jem.plan_project(project_root, env: env, run_options: run_options)
       when "apply"
    -    Kettle::Jem.apply_project(project_root, env: env, run_options: options.fetch(:run_options))
    +    Kettle::Jem.apply_project(project_root, env: env, run_options: run_options)
       when "template"
    -    run_options = options.fetch(:run_options)
         if scoped_template_run?(run_options)
           Kettle::Jem::Tasks::TemplateTask.run(project_root: project_root, env: env, run_options: run_options)
         else
           Kettle::Jem::Tasks::InstallTask.run(project_root: project_root, env: env, run_options: run_options)
         end
       when "install"
    -    Kettle::Jem::Tasks::InstallTask.run(project_root: project_root, env: env, run_options: options.fetch(:run_options))
    +    Kettle::Jem::Tasks::InstallTask.run(project_root: project_root, env: env, run_options: run_options)
       when "manifest"
         Kettle::Jem.template_manifest(project_root: project_root)
       when "selftest"
    @@ -782,8 +945,6 @@ 

     
     
    -48
    -49
     50
     51
     52
    @@ -796,10 +957,12 @@ 

    59 60 61 -62

    +62 +63 +64

    -
    # File 'lib/kettle/jem/cli.rb', line 48
    +      
    # File 'lib/kettle/jem/cli.rb', line 50
     
     def normalize_command(argv)
       args = Array(argv).dup
    @@ -859,8 +1022,6 @@ 

     
     
    -68
    -69
     70
     71
     72
    @@ -951,19 +1112,38 @@ 

    157 158 159 -160

    +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174

    -
    # File 'lib/kettle/jem/cli.rb', line 68
    +      
    # File 'lib/kettle/jem/cli.rb', line 70
     
     def parse_options(args)
       options = {
         json: false,
    +    events: false,
         run_options: {}
       }
       parser = OptionParser.new do |opts|
         opts.banner = USAGE
         opts.on("--json", "Print the full machine-readable result as JSON.") { options[:json] = true }
    +    opts.on("--events[=TYPES]", "Print newline-delimited JSON progress events. Optional comma-separated TYPES filter.") do |value|
    +      options[:events] = true
    +      options[:event_types] = value if value
    +    end
         opts.on("--report PATH", "Write the full machine-readable result to PATH as JSON.") do |path|
           options[:report_path] = path
         end
    @@ -1030,6 +1210,12 @@ 

    opts.on("--template-profile PROFILE", "Use a packaged template profile.") do |value| options[:run_options][:template_profile] = value end + opts.on("--shimmed-gem GEM", "Runtime gem required by the shim profile.") do |value| + options[:run_options][:shimmed_gem] = value + end + opts.on("--shimmed-require REQUIRE", "Require path loaded by the shim profile.") do |value| + options[:run_options][:shimmed_require] = value + end opts.on("--destination PATH", "Selftest destination root.") do |path| options[:destination_root] = path end @@ -1045,6 +1231,7 @@

    end remaining = parser.parse(args) raise ArgumentError, "Expected at most one PROJECT_ROOT" if remaining.length > 1 + raise OptionParser::InvalidOption, "--events cannot be combined with --json" if options[:events] && options[:json] options[:project_root] = remaining.first options @@ -1069,23 +1256,23 @@

    -
    # File 'lib/kettle/jem/cli.rb', line 239
    +      
    # File 'lib/kettle/jem/cli.rb', line 282
     
     def print_debug_snapshot(command, project_root:, env:, err:)
       err.puts("[kettle-jem] DEBUG: early environment snapshot")
       err.puts("  command=#{command.inspect}")
       err.puts("  project_root=#{project_root.inspect}")
    -  %w[DEBUG KETTLE_JEM_DEBUG KETTLE_DEV_DEBUG KETTLE_RB_DEV BUNDLE_GEMFILE BUNDLE_PATH GEM_HOME GEM_PATH RUBYOPT RUBYLIB PWD].each do |key|
    +  %w[DEBUG KETTLE_JEM_DEBUG KETTLE_DEV_DEBUG KETTLE_DEV_DEV BUNDLE_GEMFILE BUNDLE_PATH GEM_HOME GEM_PATH RUBYOPT RUBYLIB PWD].each do |key|
         err.puts("  #{key}=#{env_value(env, key).inspect}")
       end
     end
    @@ -1109,13 +1296,13 @@
    -
    # File 'lib/kettle/jem/cli.rb', line 262
    +      
    # File 'lib/kettle/jem/cli.rb', line 305
     
     def print_help(out)
       out.puts(USAGE)
    @@ -1141,43 +1328,48 @@ 
    -
    # File 'lib/kettle/jem/cli.rb', line 201
    +      
    # File 'lib/kettle/jem/cli.rb', line 240
     
     def print_result(command, result, options:, out:)
    +  return if options[:events]
       return if options.fetch(:run_options, {})[:quiet] && !options[:json]
     
       if options[:json]
    @@ -1207,6 +1399,9 @@ 
    @@ -1229,13 +1424,13 @@
    -
    # File 'lib/kettle/jem/cli.rb', line 267
    +      
    # File 'lib/kettle/jem/cli.rb', line 310
     
     def print_version(out)
       out.puts(Kettle::Jem::Version::VERSION)
    @@ -1281,7 +1476,9 @@ 

    43 44 45 -46

    +46 +47 +48
    # File 'lib/kettle/jem/cli.rb', line 26
    @@ -1293,7 +1490,9 @@ 

    options = parse_options(args) project_root = File.expand_path(options.fetch(:project_root) || Dir.pwd) + ensure_not_running_from_own_context!(command, project_root) print_debug_snapshot(command, project_root: project_root, env: env, err: err) if debug_enabled?(env) + options[:event_io] = out result = execute(command, project_root: project_root, env: env, options: options) write_report(options[:report_path], result) if options[:report_path] print_result(command, result, options: options, out: out) @@ -1350,13 +1549,13 @@

     
     
    -196
    -197
    -198
    -199
    +216 +217 +218 +219

    -
    # File 'lib/kettle/jem/cli.rb', line 196
    +      
    # File 'lib/kettle/jem/cli.rb', line 216
     
     def scoped_template_run?(run_options)
       run_options = run_options.to_h
    @@ -1382,13 +1581,13 @@ 

     
     
    -234
    -235
    -236
    -237
    +277 +278 +279 +280

    -
    # File 'lib/kettle/jem/cli.rb', line 234
    +      
    # File 'lib/kettle/jem/cli.rb', line 277
     
     def write_report(path, result)
       FileUtils.mkdir_p(File.dirname(File.expand_path(path)))
    @@ -1404,9 +1603,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/DecisionEvaluation.html b/gems/kettle-jem/docs/Kettle/Jem/DecisionEvaluation.html index 4066377bd..34759feeb 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/DecisionEvaluation.html +++ b/gems/kettle-jem/docs/Kettle/Jem/DecisionEvaluation.html @@ -6,7 +6,7 @@ Class: Kettle::Jem::DecisionEvaluation - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -486,12 +486,12 @@

     
     
    -372
    -373
    -374
    +431 +432 +433 -
    # File 'lib/kettle/jem.rb', line 372
    +      
    # File 'lib/kettle/jem.rb', line 431
     
     def blocking
       @blocking
    @@ -545,12 +545,12 @@ 

     
     
    -372
    -373
    -374
    +431 +432 +433

    -
    # File 'lib/kettle/jem.rb', line 372
    +      
    # File 'lib/kettle/jem.rb', line 431
     
     def category
       @category
    @@ -604,12 +604,12 @@ 

     
     
    -372
    -373
    -374
    +431 +432 +433

    -
    # File 'lib/kettle/jem.rb', line 372
    +      
    # File 'lib/kettle/jem.rb', line 431
     
     def default_action
       @default_action
    @@ -663,12 +663,12 @@ 

     
     
    -372
    -373
    -374
    +431 +432 +433

    -
    # File 'lib/kettle/jem.rb', line 372
    +      
    # File 'lib/kettle/jem.rb', line 431
     
     def diagnostics
       @diagnostics
    @@ -722,12 +722,12 @@ 

     
     
    -372
    -373
    -374
    +431 +432 +433

    -
    # File 'lib/kettle/jem.rb', line 372
    +      
    # File 'lib/kettle/jem.rb', line 431
     
     def file
       @file
    @@ -781,12 +781,12 @@ 

     
     
    -372
    -373
    -374
    +431 +432 +433

    -
    # File 'lib/kettle/jem.rb', line 372
    +      
    # File 'lib/kettle/jem.rb', line 431
     
     def id
       @id
    @@ -840,12 +840,12 @@ 

     
     
    -372
    -373
    -374
    +431 +432 +433

    -
    # File 'lib/kettle/jem.rb', line 372
    +      
    # File 'lib/kettle/jem.rb', line 431
     
     def prompt
       @prompt
    @@ -899,12 +899,12 @@ 

     
     
    -372
    -373
    -374
    +431 +432 +433

    -
    # File 'lib/kettle/jem.rb', line 372
    +      
    # File 'lib/kettle/jem.rb', line 431
     
     def prompt_required
       @prompt_required
    @@ -958,12 +958,12 @@ 

     
     
    -372
    -373
    -374
    +431 +432 +433

    -
    # File 'lib/kettle/jem.rb', line 372
    +      
    # File 'lib/kettle/jem.rb', line 431
     
     def selected_action
       @selected_action
    @@ -1017,12 +1017,12 @@ 

     
     
    -372
    -373
    -374
    +431 +432 +433

    -
    # File 'lib/kettle/jem.rb', line 372
    +      
    # File 'lib/kettle/jem.rb', line 431
     
     def severity
       @severity
    @@ -1076,12 +1076,12 @@ 

     
     
    -372
    -373
    -374
    +431 +432 +433

    -
    # File 'lib/kettle/jem.rb', line 372
    +      
    # File 'lib/kettle/jem.rb', line 431
     
     def source
       @source
    @@ -1113,24 +1113,24 @@ 

     
     
    -385
    -386
    -387
    -388
    -389
    -390
    -391
    -392
    -393
    -394
    -395
    -396
    -397
    -398
    -399
    +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458

    -
    # File 'lib/kettle/jem.rb', line 385
    +      
    # File 'lib/kettle/jem.rb', line 444
     
     def to_h
       {
    @@ -1157,9 +1157,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/DecisionPolicy.html b/gems/kettle-jem/docs/Kettle/Jem/DecisionPolicy.html index cc3cd043e..42ddb9ceb 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/DecisionPolicy.html +++ b/gems/kettle-jem/docs/Kettle/Jem/DecisionPolicy.html @@ -6,7 +6,7 @@ Class: Kettle::Jem::DecisionPolicy - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -603,16 +603,16 @@

     
     
    -457
    -458
    -459
    -460
    -461
    -462
    -463
    +516 +517 +518 +519 +520 +521 +522

    -
    # File 'lib/kettle/jem.rb', line 457
    +      
    # File 'lib/kettle/jem.rb', line 516
     
     def initialize(mode: :accept, failure_mode: "error", require_clean: nil, input_source: "default", prompt_answers: {})
       @mode = normalize_mode(mode)
    @@ -658,12 +658,12 @@ 

     
     
    -406
    -407
    -408
    +465 +466 +467

    -
    # File 'lib/kettle/jem.rb', line 406
    +      
    # File 'lib/kettle/jem.rb', line 465
     
     def failure_mode
       @failure_mode
    @@ -700,12 +700,12 @@ 

     
     
    -406
    -407
    -408
    +465 +466 +467

    -
    # File 'lib/kettle/jem.rb', line 406
    +      
    # File 'lib/kettle/jem.rb', line 465
     
     def input_source
       @input_source
    @@ -742,12 +742,12 @@ 

     
     
    -406
    -407
    -408
    +465 +466 +467

    -
    # File 'lib/kettle/jem.rb', line 406
    +      
    # File 'lib/kettle/jem.rb', line 465
     
     def mode
       @mode
    @@ -784,12 +784,12 @@ 

     
     
    -406
    -407
    -408
    +465 +466 +467

    -
    # File 'lib/kettle/jem.rb', line 406
    +      
    # File 'lib/kettle/jem.rb', line 465
     
     def prompt_answers
       @prompt_answers
    @@ -826,12 +826,12 @@ 

     
     
    -406
    -407
    -408
    +465 +466 +467

    -
    # File 'lib/kettle/jem.rb', line 406
    +      
    # File 'lib/kettle/jem.rb', line 465
     
     def require_clean
       @require_clean
    @@ -886,12 +886,12 @@ 

     
     
    -433
    -434
    -435
    +492 +493 +494

    -
    # File 'lib/kettle/jem.rb', line 433
    +      
    # File 'lib/kettle/jem.rb', line 492
     
     def self.falsey?(value)
       FALSE_VALUES.include?(value.to_s.strip.downcase)
    @@ -916,25 +916,25 @@ 

     
     
    -408
    -409
    -410
    -411
    -412
    -413
    -414
    -415
    -416
    -417
    -418
    -419
    -420
    -421
    -422
    -423
    +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482

    -
    # File 'lib/kettle/jem.rb', line 408
    +      
    # File 'lib/kettle/jem.rb', line 467
     
     def self.from_env(env = {}, **options)
       env_hash = env || {}
    @@ -972,19 +972,19 @@ 

     
     
    -446
    -447
    -448
    -449
    -450
    -451
    -452
    -453
    -454
    -455
    +505 +506 +507 +508 +509 +510 +511 +512 +513 +514

    -
    # File 'lib/kettle/jem.rb', line 446
    +      
    # File 'lib/kettle/jem.rb', line 505
     
     def self.parse_prompt_answers(value)
       return {} if value.nil? || value.to_s.strip.empty?
    @@ -1016,12 +1016,12 @@ 

     
     
    -425
    -426
    -427
    +484 +485 +486

    -
    # File 'lib/kettle/jem.rb', line 425
    +      
    # File 'lib/kettle/jem.rb', line 484
     
     def self.symbolize_keys(hash)
       hash.each_with_object({}) { |(key, value), acc| acc[key.to_sym] = value }
    @@ -1069,12 +1069,12 @@ 

     
     
    -429
    -430
    -431
    +488 +489 +490

    -
    # File 'lib/kettle/jem.rb', line 429
    +      
    # File 'lib/kettle/jem.rb', line 488
     
     def self.truthy?(value)
       TRUE_VALUES.include?(value.to_s.strip.downcase)
    @@ -1099,17 +1099,17 @@ 

     
     
    -437
    -438
    -439
    -440
    -441
    -442
    -443
    -444
    +496 +497 +498 +499 +500 +501 +502 +503

    -
    # File 'lib/kettle/jem.rb', line 437
    +      
    # File 'lib/kettle/jem.rb', line 496
     
     def self.value_to_boolean(value)
       return true if value == true
    @@ -1168,12 +1168,12 @@ 

     
     
    -465
    -466
    -467
    +524 +525 +526

    -
    # File 'lib/kettle/jem.rb', line 465
    +      
    # File 'lib/kettle/jem.rb', line 524
     
     def accept?
       mode == :accept
    @@ -1221,12 +1221,12 @@ 

     
     
    -469
    -470
    -471
    +528 +529 +530

    -
    # File 'lib/kettle/jem.rb', line 469
    +      
    # File 'lib/kettle/jem.rb', line 528
     
     def interactive?
       mode == :interactive
    @@ -1274,12 +1274,12 @@ 

     
     
    -473
    -474
    -475
    +532 +533 +534

    -
    # File 'lib/kettle/jem.rb', line 473
    +      
    # File 'lib/kettle/jem.rb', line 532
     
     def non_interactive?
       !interactive?
    @@ -1327,55 +1327,55 @@ 

     
     
    -477
    -478
    -479
    -480
    -481
    -482
    -483
    -484
    -485
    -486
    -487
    -488
    -489
    -490
    -491
    -492
    -493
    -494
    -495
    -496
    -497
    -498
    -499
    -500
    -501
    -502
    -503
    -504
    -505
    -506
    -507
    -508
    -509
    -510
    -511
    -512
    -513
    -514
    -515
    -516
    -517
    -518
    -519
    -520
    -521
    -522
    +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581

    -
    # File 'lib/kettle/jem.rb', line 477
    +      
    # File 'lib/kettle/jem.rb', line 536
     
     def resolve(id:, category:, default_action:, file: nil, severity: :advisory, diagnostics: [])
       action = normalize_action(default_action)
    @@ -1443,21 +1443,21 @@ 

     
     
    -524
    -525
    -526
    -527
    -528
    -529
    -530
    -531
    -532
    -533
    -534
    -535
    +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594

    -
    # File 'lib/kettle/jem.rb', line 524
    +      
    # File 'lib/kettle/jem.rb', line 583
     
     def to_h
       {
    @@ -1481,9 +1481,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/Error.html b/gems/kettle-jem/docs/Kettle/Jem/Error.html index d2d83d12b..760c13e35 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/Error.html +++ b/gems/kettle-jem/docs/Kettle/Jem/Error.html @@ -6,7 +6,7 @@ Exception: Kettle::Jem::Error - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -117,9 +117,9 @@ diff --git a/gems/kettle-jem/docs/Kettle/Jem/EventStream.html b/gems/kettle-jem/docs/Kettle/Jem/EventStream.html new file mode 100644 index 000000000..259e43ca0 --- /dev/null +++ b/gems/kettle-jem/docs/Kettle/Jem/EventStream.html @@ -0,0 +1,272 @@ + + + + + + + Class: Kettle::Jem::EventStream + + — Documentation by YARD 0.9.45 + + + + + + + + + + + + + + + + + + + + + +
    + + +

    Class: Kettle::Jem::EventStream + + + +

    +
    + +
    +
    Inherits:
    +
    + Object + +
      +
    • Object
    • + + + +
    + show all + +
    +
    + + + + + + + + + + + +
    +
    Defined in:
    +
    lib/kettle/jem.rb +
    +
    + +
    + + + + + + + + + +

    + Instance Method Summary + collapse +

    + + + + + +
    +

    Constructor Details

    + +
    +

    + + #initialize(io, types:) ⇒ EventStream + + + + + +

    +
    +

    Returns a new instance of EventStream.

    + + +
    +
    +
    + + +
    + + + + +
    +
    +
    +
    +3628
    +3629
    +3630
    +3631
    +
    +
    # File 'lib/kettle/jem.rb', line 3628
    +
    +def initialize(io, types:)
    +  @io = io
    +  @types = types
    +end
    +
    +
    + +
    + + +
    +

    Instance Method Details

    + + +
    +

    + + #emit(payload) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +3633
    +3634
    +3635
    +3636
    +3637
    +3638
    +
    +
    # File 'lib/kettle/jem.rb', line 3633
    +
    +def emit(payload)
    +  return unless @types.include?(payload.fetch(:type).to_s)
    +
    +  @io.puts(JSON.generate(payload.compact))
    +  @io.flush if @io.respond_to?(:flush)
    +end
    +
    +
    + +
    + +
    + + + +
    + + diff --git a/gems/kettle-jem/docs/Kettle/Jem/GemSpecReader.html b/gems/kettle-jem/docs/Kettle/Jem/GemSpecReader.html index 596ef9b07..17be50780 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/GemSpecReader.html +++ b/gems/kettle-jem/docs/Kettle/Jem/GemSpecReader.html @@ -6,7 +6,7 @@ Class: Kettle::Jem::GemSpecReader - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -204,12 +204,12 @@

     
     
    -973
    -974
    -975
    +1129 +1130 +1131

    -
    # File 'lib/kettle/jem.rb', line 973
    +      
    # File 'lib/kettle/jem.rb', line 1129
     
     def clear_cache!
       CACHE.mutex.synchronize { CACHE.entries.clear }
    @@ -234,24 +234,24 @@ 

     
     
    -957
    -958
    -959
    -960
    -961
    -962
    -963
    -964
    -965
    -966
    -967
    -968
    -969
    -970
    -971
    +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127

    -
    # File 'lib/kettle/jem.rb', line 957
    +      
    # File 'lib/kettle/jem.rb', line 1113
     
     def load(root)
       cache_key = File.expand_path(root.to_s)
    @@ -278,9 +278,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/PluginContext.html b/gems/kettle-jem/docs/Kettle/Jem/PluginContext.html index 80115abfb..c291fb984 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/PluginContext.html +++ b/gems/kettle-jem/docs/Kettle/Jem/PluginContext.html @@ -6,7 +6,7 @@ Class: Kettle::Jem::PluginContext - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -459,21 +459,21 @@

     
     
    -1349
    -1350
    -1351
    -1352
    -1353
    -1354
    -1355
    -1356
    -1357
    -1358
    -1359
    -1360
    +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519

    -
    # File 'lib/kettle/jem.rb', line 1349
    +      
    # File 'lib/kettle/jem.rb', line 1508
     
     def initialize(project_root:, mode:, facts:, recipe_pack:, recipe_reports:, changed_files:, diagnostics:, phase_reports: [])
       @project_root = project_root
    @@ -524,12 +524,12 @@ 

     
     
    -1338
    -1339
    -1340
    +1497 +1498 +1499

    -
    # File 'lib/kettle/jem.rb', line 1338
    +      
    # File 'lib/kettle/jem.rb', line 1497
     
     def changed_files
       @changed_files
    @@ -566,12 +566,12 @@ 

     
     
    -1338
    -1339
    -1340
    +1497 +1498 +1499

    -
    # File 'lib/kettle/jem.rb', line 1338
    +      
    # File 'lib/kettle/jem.rb', line 1497
     
     def diagnostics
       @diagnostics
    @@ -608,12 +608,12 @@ 

     
     
    -1338
    -1339
    -1340
    +1497 +1498 +1499

    -
    # File 'lib/kettle/jem.rb', line 1338
    +      
    # File 'lib/kettle/jem.rb', line 1497
     
     def facts
       @facts
    @@ -650,12 +650,12 @@ 

     
     
    -1338
    -1339
    -1340
    +1497 +1498 +1499

    -
    # File 'lib/kettle/jem.rb', line 1338
    +      
    # File 'lib/kettle/jem.rb', line 1497
     
     def helpers
       @helpers
    @@ -692,12 +692,12 @@ 

     
     
    -1338
    -1339
    -1340
    +1497 +1498 +1499

    -
    # File 'lib/kettle/jem.rb', line 1338
    +      
    # File 'lib/kettle/jem.rb', line 1497
     
     def mode
       @mode
    @@ -734,12 +734,12 @@ 

     
     
    -1338
    -1339
    -1340
    +1497 +1498 +1499

    -
    # File 'lib/kettle/jem.rb', line 1338
    +      
    # File 'lib/kettle/jem.rb', line 1497
     
     def out
       @out
    @@ -776,12 +776,12 @@ 

     
     
    -1338
    -1339
    -1340
    +1497 +1498 +1499

    -
    # File 'lib/kettle/jem.rb', line 1338
    +      
    # File 'lib/kettle/jem.rb', line 1497
     
     def phase_reports
       @phase_reports
    @@ -818,12 +818,12 @@ 

     
     
    -1338
    -1339
    -1340
    +1497 +1498 +1499

    -
    # File 'lib/kettle/jem.rb', line 1338
    +      
    # File 'lib/kettle/jem.rb', line 1497
     
     def project_root
       @project_root
    @@ -860,12 +860,12 @@ 

     
     
    -1338
    -1339
    -1340
    +1497 +1498 +1499

    -
    # File 'lib/kettle/jem.rb', line 1338
    +      
    # File 'lib/kettle/jem.rb', line 1497
     
     def recipe_pack
       @recipe_pack
    @@ -902,12 +902,12 @@ 

     
     
    -1338
    -1339
    -1340
    +1497 +1498 +1499

    -
    # File 'lib/kettle/jem.rb', line 1338
    +      
    # File 'lib/kettle/jem.rb', line 1497
     
     def recipe_reports
       @recipe_reports
    @@ -923,9 +923,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/PluginHelpers.html b/gems/kettle-jem/docs/Kettle/Jem/PluginHelpers.html index d3d45d5df..64557fd61 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/PluginHelpers.html +++ b/gems/kettle-jem/docs/Kettle/Jem/PluginHelpers.html @@ -6,7 +6,7 @@ Class: Kettle::Jem::PluginHelpers - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -197,14 +197,14 @@

     
     
    -1364
    -1365
    -1366
    -1367
    -1368
    +1523 +1524 +1525 +1526 +1527

    -
    # File 'lib/kettle/jem.rb', line 1364
    +      
    # File 'lib/kettle/jem.rb', line 1523
     
     def initialize(project_root:, changed_files:, diagnostics:)
       @project_root = project_root
    @@ -238,19 +238,19 @@ 

     
     
    -1370
    -1371
    -1372
    -1373
    -1374
    -1375
    -1376
    -1377
    -1378
    -1379
    +1529 +1530 +1531 +1532 +1533 +1534 +1535 +1536 +1537 +1538

    -
    # File 'lib/kettle/jem.rb', line 1370
    +      
    # File 'lib/kettle/jem.rb', line 1529
     
     def record_template_result(path, action)
       relative_path = relative_project_path(path)
    @@ -272,9 +272,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/PluginLoader.html b/gems/kettle-jem/docs/Kettle/Jem/PluginLoader.html index ec3be4a00..bc4041f38 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/PluginLoader.html +++ b/gems/kettle-jem/docs/Kettle/Jem/PluginLoader.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::PluginLoader - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -280,12 +280,12 @@

     
     
    -1332
    -1333
    -1334
    +1491 +1492 +1493

    -
    # File 'lib/kettle/jem.rb', line 1332
    +      
    # File 'lib/kettle/jem.rb', line 1491
     
     def camelize(value)
       value.to_s.split("_").map(&:capitalize).join
    @@ -310,15 +310,15 @@ 

     
     
    -1295
    -1296
    -1297
    -1298
    -1299
    -1300
    +1454 +1455 +1456 +1457 +1458 +1459

    -
    # File 'lib/kettle/jem.rb', line 1295
    +      
    # File 'lib/kettle/jem.rb', line 1454
     
     def load!(plugin_names:)
       names = normalize_plugin_names(plugin_names)
    @@ -346,23 +346,23 @@ 

     
     
    -1302
    -1303
    -1304
    -1305
    -1306
    -1307
    -1308
    -1309
    -1310
    -1311
    -1312
    -1313
    -1314
    -1315
    +1461 +1462 +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474

    -
    # File 'lib/kettle/jem.rb', line 1302
    +      
    # File 'lib/kettle/jem.rb', line 1461
     
     def load_plugin!(plugin_name, registry:)
       require(plugin_require_path(plugin_name))
    @@ -398,12 +398,12 @@ 

     
     
    -1317
    -1318
    -1319
    +1476 +1477 +1478

    -
    # File 'lib/kettle/jem.rb', line 1317
    +      
    # File 'lib/kettle/jem.rb', line 1476
     
     def normalize_plugin_names(plugin_names)
       Array(plugin_names).flatten.map { |name| name.to_s.strip }.reject(&:empty?).uniq
    @@ -428,15 +428,15 @@ 

     
     
    -1325
    -1326
    -1327
    -1328
    -1329
    -1330
    +1484 +1485 +1486 +1487 +1488 +1489

    -
    # File 'lib/kettle/jem.rb', line 1325
    +      
    # File 'lib/kettle/jem.rb', line 1484
     
     def plugin_handle(plugin_name)
       constant_name = plugin_name.to_s.split("-").map { |part| camelize(part) }.join("::")
    @@ -464,12 +464,12 @@ 

     
     
    -1321
    -1322
    -1323
    +1480 +1481 +1482

    -
    # File 'lib/kettle/jem.rb', line 1321
    +      
    # File 'lib/kettle/jem.rb', line 1480
     
     def plugin_require_path(plugin_name)
       plugin_name.to_s.tr("-", "/")
    @@ -484,9 +484,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/PluginOutput.html b/gems/kettle-jem/docs/Kettle/Jem/PluginOutput.html index d299bd55d..9275783f6 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/PluginOutput.html +++ b/gems/kettle-jem/docs/Kettle/Jem/PluginOutput.html @@ -6,7 +6,7 @@ Class: Kettle::Jem::PluginOutput - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -220,12 +220,12 @@

     
     
    -1402
    -1403
    -1404
    +1561 +1562 +1563

    -
    # File 'lib/kettle/jem.rb', line 1402
    +      
    # File 'lib/kettle/jem.rb', line 1561
     
     def initialize(diagnostics:)
       @diagnostics = diagnostics
    @@ -257,12 +257,12 @@ 

     
     
    -1406
    -1407
    -1408
    +1565 +1566 +1567

    -
    # File 'lib/kettle/jem.rb', line 1406
    +      
    # File 'lib/kettle/jem.rb', line 1565
     
     def report_detail(message)
       @diagnostics << {kind: "plugin_detail", message: message.to_s}
    @@ -287,12 +287,12 @@ 

     
     
    -1410
    -1411
    -1412
    +1569 +1570 +1571

    -
    # File 'lib/kettle/jem.rb', line 1410
    +      
    # File 'lib/kettle/jem.rb', line 1569
     
     def warning(message)
       @diagnostics << {kind: "plugin_warning", message: message.to_s}
    @@ -307,9 +307,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/PluginRegistrar.html b/gems/kettle-jem/docs/Kettle/Jem/PluginRegistrar.html index 9eedb58ab..ba3e36dca 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/PluginRegistrar.html +++ b/gems/kettle-jem/docs/Kettle/Jem/PluginRegistrar.html @@ -6,7 +6,7 @@ Class: Kettle::Jem::PluginRegistrar - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -276,13 +276,13 @@

     
     
    -1272
    -1273
    -1274
    -1275
    +1431 +1432 +1433 +1434

    -
    # File 'lib/kettle/jem.rb', line 1272
    +      
    # File 'lib/kettle/jem.rb', line 1431
     
     def initialize(plugin_name:, registry:)
       @plugin_name = plugin_name.to_s
    @@ -325,12 +325,12 @@ 

     
     
    -1270
    -1271
    -1272
    +1429 +1430 +1431

    -
    # File 'lib/kettle/jem.rb', line 1270
    +      
    # File 'lib/kettle/jem.rb', line 1429
     
     def plugin_name
       @plugin_name
    @@ -362,12 +362,12 @@ 

     
     
    -1285
    -1286
    -1287
    +1444 +1445 +1446

    -
    # File 'lib/kettle/jem.rb', line 1285
    +      
    # File 'lib/kettle/jem.rb', line 1444
     
     def after_phase(phase, &block)
       on_phase(phase, timing: :after, &block)
    @@ -392,12 +392,12 @@ 

     
     
    -1281
    -1282
    -1283
    +1440 +1441 +1442

    -
    # File 'lib/kettle/jem.rb', line 1281
    +      
    # File 'lib/kettle/jem.rb', line 1440
     
     def before_phase(phase, &block)
       on_phase(phase, timing: :before, &block)
    @@ -422,12 +422,12 @@ 

     
     
    -1277
    -1278
    -1279
    +1436 +1437 +1438

    -
    # File 'lib/kettle/jem.rb', line 1277
    +      
    # File 'lib/kettle/jem.rb', line 1436
     
     def on_phase(phase, timing: :after, &block)
       @registry.register(plugin_name: plugin_name, phase: phase, timing: timing, &block)
    @@ -442,9 +442,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/PluginRegistry.html b/gems/kettle-jem/docs/Kettle/Jem/PluginRegistry.html index 94f2cce2f..1b70040a2 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/PluginRegistry.html +++ b/gems/kettle-jem/docs/Kettle/Jem/PluginRegistry.html @@ -6,7 +6,7 @@ Class: Kettle::Jem::PluginRegistry - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -386,15 +386,15 @@

     
     
    -1212
    -1213
    -1214
    -1215
    -1216
    -1217
    +1371 +1372 +1373 +1374 +1375 +1376

    -
    # File 'lib/kettle/jem.rb', line 1212
    +      
    # File 'lib/kettle/jem.rb', line 1371
     
     def initialize(configured_plugins: [], loaded_plugins: [])
       @hooks = []
    @@ -439,12 +439,12 @@ 

     
     
    -1210
    -1211
    -1212
    +1369 +1370 +1371

    -
    # File 'lib/kettle/jem.rb', line 1210
    +      
    # File 'lib/kettle/jem.rb', line 1369
     
     def configured_plugins
       @configured_plugins
    @@ -481,12 +481,12 @@ 

     
     
    -1210
    -1211
    -1212
    +1369 +1370 +1371

    -
    # File 'lib/kettle/jem.rb', line 1210
    +      
    # File 'lib/kettle/jem.rb', line 1369
     
     def hooks
       @hooks
    @@ -523,12 +523,12 @@ 

     
     
    -1210
    -1211
    -1212
    +1369 +1370 +1371

    -
    # File 'lib/kettle/jem.rb', line 1210
    +      
    # File 'lib/kettle/jem.rb', line 1369
     
     def load_errors
       @load_errors
    @@ -565,12 +565,12 @@ 

     
     
    -1210
    -1211
    -1212
    +1369 +1370 +1371

    -
    # File 'lib/kettle/jem.rb', line 1210
    +      
    # File 'lib/kettle/jem.rb', line 1369
     
     def loaded_plugins
       @loaded_plugins
    @@ -625,12 +625,12 @@ 

     
     
    -1244
    -1245
    -1246
    +1403 +1404 +1405

    -
    # File 'lib/kettle/jem.rb', line 1244
    +      
    # File 'lib/kettle/jem.rb', line 1403
     
     def empty?
       @hooks.empty?
    @@ -678,19 +678,19 @@ 

     
     
    -1219
    -1220
    -1221
    -1222
    -1223
    -1224
    -1225
    -1226
    -1227
    -1228
    +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387

    -
    # File 'lib/kettle/jem.rb', line 1219
    +      
    # File 'lib/kettle/jem.rb', line 1378
     
     def register(plugin_name:, phase:, timing:, &callback)
       raise ArgumentError, "Plugin callbacks require a block" unless callback
    @@ -722,22 +722,22 @@ 

     
     
    -1230
    -1231
    -1232
    -1233
    -1234
    -1235
    -1236
    -1237
    -1238
    -1239
    -1240
    -1241
    -1242
    +1389 +1390 +1391 +1392 +1393 +1394 +1395 +1396 +1397 +1398 +1399 +1400 +1401

    -
    # File 'lib/kettle/jem.rb', line 1230
    +      
    # File 'lib/kettle/jem.rb', line 1389
     
     def run(timing:, phase:, context:, actor:, phase_stats:)
       normalized_phase = normalize_phase(phase)
    @@ -762,9 +762,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/PluginRegistry/Hook.html b/gems/kettle-jem/docs/Kettle/Jem/PluginRegistry/Hook.html index 6308371fd..064072d72 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/PluginRegistry/Hook.html +++ b/gems/kettle-jem/docs/Kettle/Jem/PluginRegistry/Hook.html @@ -6,7 +6,7 @@ Class: Kettle::Jem::PluginRegistry::Hook - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -269,12 +269,12 @@

     
     
    -1207
    -1208
    -1209
    +1366 +1367 +1368

    -
    # File 'lib/kettle/jem.rb', line 1207
    +      
    # File 'lib/kettle/jem.rb', line 1366
     
     def callback
       @callback
    @@ -328,12 +328,12 @@ 

     
     
    -1207
    -1208
    -1209
    +1366 +1367 +1368

    -
    # File 'lib/kettle/jem.rb', line 1207
    +      
    # File 'lib/kettle/jem.rb', line 1366
     
     def phase
       @phase
    @@ -387,12 +387,12 @@ 

     
     
    -1207
    -1208
    -1209
    +1366 +1367 +1368

    -
    # File 'lib/kettle/jem.rb', line 1207
    +      
    # File 'lib/kettle/jem.rb', line 1366
     
     def plugin_name
       @plugin_name
    @@ -446,12 +446,12 @@ 

     
     
    -1207
    -1208
    -1209
    +1366 +1367 +1368

    -
    # File 'lib/kettle/jem.rb', line 1207
    +      
    # File 'lib/kettle/jem.rb', line 1366
     
     def timing
       @timing
    @@ -467,9 +467,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/ReadmePostProcessor.html b/gems/kettle-jem/docs/Kettle/Jem/ReadmePostProcessor.html index a64950abf..3147d5c5f 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/ReadmePostProcessor.html +++ b/gems/kettle-jem/docs/Kettle/Jem/ReadmePostProcessor.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::ReadmePostProcessor - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -137,6 +137,36 @@

    }.freeze }.freeze

    +
    VERSIONED_ENGINE_COMPATIBILITY_BADGES = + +
    +
    [
    +  {
    +    engine: "jruby",
    +    version: "10.0",
    +    workflow_path: ".github/workflows/jruby-10.0.yml",
    +    workflow_file: "jruby-10.0.yml",
    +    row_prefix: "| Works with JRuby",
    +    badge_label: "💎jruby-10.0i",
    +    workflow_label: "🚎jruby-10.0-wf",
    +    inline: "[![JRuby 10.0 Compat][💎jruby-10.0i]][🚎jruby-10.0-wf]",
    +    insert_before: "💎jruby-c-i",
    +    badge_definition: "[💎jruby-10.0i]: https://img.shields.io/badge/JRuby-10.0-FBE742?style=for-the-badge&logo=ruby&logoColor=red"
    +  }.freeze,
    +  {
    +    engine: "truby",
    +    version: "33.0",
    +    workflow_path: ".github/workflows/truffleruby-33.0.yml",
    +    workflow_file: "truffleruby-33.0.yml",
    +    row_prefix: "| Works with Truffle Ruby",
    +    badge_label: "💎truby-33.0i",
    +    workflow_label: "🚎truby-33.0-wf",
    +    inline: "[![Truffle Ruby 33.0 Compat][💎truby-33.0i]][🚎truby-33.0-wf]",
    +    insert_before: "💎truby-c-i",
    +    badge_definition: "[💎truby-33.0i]: https://img.shields.io/badge/Truffle_Ruby-33.0-34BCB1?style=for-the-badge&logo=ruby&logoColor=pink"
    +  }.freeze
    +].freeze
    + @@ -157,6 +187,75 @@

  • + .add_supported_versioned_engine_badges(content, min_ruby, workflow_paths) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .add_versioned_engine_badge_definitions(content, badge) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .add_versioned_engine_badge_to_row(content, badge) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + .compatibility_badge_min_mri(label) ⇒ Object @@ -217,6 +316,29 @@

    +
    +
    + +

  • + + +
  • + + + .ensure_markdown_link_definition(content, definition) ⇒ Object + + + + + + + + + + + + +
    @@ -585,6 +707,52 @@

    +
    +
    + +

  • + + +
  • + + + .versioned_engine_badge_compatible?(badge, min_ruby) ⇒ Boolean + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .workflow_definition_base_url(content) ⇒ Object + + + + + + + + + + + + +
    @@ -625,7 +793,161 @@

    Class Method Details

    -

    +

    + + .add_supported_versioned_engine_badges(content, min_ruby, workflow_paths) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +756
    +757
    +758
    +759
    +760
    +761
    +762
    +763
    +764
    +765
    +766
    +767
    +768
    +
    +
    # File 'lib/kettle/jem.rb', line 756
    +
    +def add_supported_versioned_engine_badges(content, min_ruby, workflow_paths)
    +  existing_workflows = Array(workflow_paths).map { |path| path.to_s.delete_prefix("./") }.to_set
    +  VERSIONED_ENGINE_COMPATIBILITY_BADGES.reduce(content.to_s) do |processed, badge|
    +    next processed unless existing_workflows.include?(badge.fetch(:workflow_path))
    +    next processed if processed.include?("[#{badge.fetch(:badge_label)}]:")
    +    next processed unless versioned_engine_badge_compatible?(badge, min_ruby)
    +
    +    with_inline = add_versioned_engine_badge_to_row(processed, badge)
    +    next processed if with_inline == processed
    +
    +    add_versioned_engine_badge_definitions(with_inline, badge)
    +  end
    +end
    +
    +
    + +
    +

    + + .add_versioned_engine_badge_definitions(content, badge) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +792
    +793
    +794
    +795
    +796
    +797
    +798
    +799
    +800
    +801
    +802
    +803
    +
    +
    # File 'lib/kettle/jem.rb', line 792
    +
    +def add_versioned_engine_badge_definitions(content, badge)
    +  processed = ensure_markdown_link_definition(content, badge.fetch(:badge_definition))
    +  return processed if processed.include?("[#{badge.fetch(:workflow_label)}]:")
    +
    +  workflow_base = workflow_definition_base_url(processed)
    +  return processed unless workflow_base
    +
    +  ensure_markdown_link_definition(
    +    processed,
    +    "[#{badge.fetch(:workflow_label)}]: #{workflow_base}/actions/workflows/#{badge.fetch(:workflow_file)}"
    +  )
    +end
    +
    +
    + +
    +

    + + .add_versioned_engine_badge_to_row(content, badge) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +775
    +776
    +777
    +778
    +779
    +780
    +781
    +782
    +783
    +784
    +785
    +786
    +787
    +788
    +789
    +790
    +
    +
    # File 'lib/kettle/jem.rb', line 775
    +
    +def add_versioned_engine_badge_to_row(content, badge)
    +  lines = content.lines
    +  row_index = lines.index { |line| line.lstrip.start_with?(badge.fetch(:row_prefix)) }
    +  return content unless row_index
    +  return content if lines.fetch(row_index).include?(badge.fetch(:badge_label))
    +
    +  line = lines.fetch(row_index)
    +  insert_before = badge.fetch(:insert_before)
    +  inline = badge.fetch(:inline)
    +  lines[row_index] = if line.include?("[#{insert_before}]")
    +    line.sub(/(?=\[!\[[^\]]+\]\[#{Regexp.escape(insert_before)}\])/, "#{inline} ")
    +  else
    +    line.sub(/\s*\|\s*$/, " #{inline}|")
    +  end
    +  lines.join
    +end
    +
    +
    + +
    +

    .compatibility_badge_min_mri(label) ⇒ Object @@ -639,18 +961,18 @@

     
     
    -679
    -680
    -681
    -682
    -683
    -684
    -685
    -686
    -687
    +831 +832 +833 +834 +835 +836 +837 +838 +839

  • -
    # File 'lib/kettle/jem.rb', line 679
    +      
    # File 'lib/kettle/jem.rb', line 831
     
     def compatibility_badge_min_mri(label)
       if (match = label.match(/\A💎ruby-(?<version>\d+\.\d+)i\z/))
    @@ -704,13 +1026,13 @@ 

     
     
    -769
    -770
    -771
    -772
    +924 +925 +926 +927

    -
    # File 'lib/kettle/jem.rb', line 769
    +      
    # File 'lib/kettle/jem.rb', line 924
     
     def compatibility_row?(line)
       text = line.to_s.lstrip
    @@ -736,20 +1058,22 @@ 
    -
    # File 'lib/kettle/jem.rb', line 774
    +      
    # File 'lib/kettle/jem.rb', line 929
     
     def delete_markdown_link_definitions(content, labels)
    +  Kettle::Jem.ensure_runtime_dependencies!
       labels.uniq.reduce(content.to_s) do |processed, label|
         Ast::Crispr::Delete.call(
           content: processed,
    @@ -761,6 +1085,44 @@ 
    -
    # File 'lib/kettle/jem.rb', line 755
    +      
    # File 'lib/kettle/jem.rb', line 908
     
     def markdown_inline_reference_owners(content)
    +  Kettle::Jem.ensure_runtime_dependencies!
       context = Ast::Crispr::Markdown::Markly.document_context(content: content.to_s, source_label: "README.md")
       context.structural_owners(owner_scope: :inline_references)
     rescue Ast::Crispr::Error
    @@ -814,17 +1178,19 @@ 
    -
    # File 'lib/kettle/jem.rb', line 748
    +      
    # File 'lib/kettle/jem.rb', line 900
     
     def markdown_link_definition_owners(content)
    +  Kettle::Jem.ensure_runtime_dependencies!
       context = Ast::Crispr::Markdown::Markly.document_context(content: content.to_s, source_label: "README.md")
       context.structural_owners(owner_scope: :link_definitions)
     rescue Ast::Crispr::Error
    @@ -850,17 +1216,19 @@ 

     
     
    -762
    -763
    -764
    -765
    -766
    -767
    +916 +917 +918 +919 +920 +921 +922

    -
    # File 'lib/kettle/jem.rb', line 762
    +      
    # File 'lib/kettle/jem.rb', line 916
     
     def markdown_table_row_owners(content)
    +  Kettle::Jem.ensure_runtime_dependencies!
       context = Ast::Crispr::Markdown::Markly.document_context(content: content.to_s, source_label: "README.md")
       context.structural_owners(owner_scope: :table_rows)
     rescue Ast::Crispr::Error
    @@ -886,18 +1254,18 @@ 

     
     
    -717
    -718
    -719
    -720
    -721
    -722
    -723
    -724
    -725
    +869 +870 +871 +872 +873 +874 +875 +876 +877

    -
    # File 'lib/kettle/jem.rb', line 717
    +      
    # File 'lib/kettle/jem.rb', line 869
     
     def normalize_compatibility_badge_cell(cell)
       cell.to_s
    @@ -928,27 +1296,27 @@ 

     
     
    -698
    -699
    -700
    -701
    -702
    -703
    -704
    -705
    -706
    -707
    -708
    -709
    -710
    -711
    -712
    -713
    -714
    -715
    +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867

    -
    # File 'lib/kettle/jem.rb', line 698
    +      
    # File 'lib/kettle/jem.rb', line 850
     
     def normalize_compatibility_rows(content)
       lines = content.lines
    @@ -988,27 +1356,33 @@ 

     
     
    -604
    -605
    -606
    -607
    -608
    -609
    -610
    -611
    -612
    -613
    +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701

    -
    # File 'lib/kettle/jem.rb', line 604
    +      
    # File 'lib/kettle/jem.rb', line 689
     
     def process(content:, min_ruby:, engines: nil, workflow_paths: nil)
    +  Kettle::Jem.ensure_runtime_dependencies!
       processed = content.to_s
       processed = remove_disabled_engine_content(processed, engines) if engines
       processed = remove_missing_workflow_badges(processed, workflow_paths) if workflow_paths
       return processed if min_ruby.to_s.empty?
     
    -  processed = remove_incompatible_compatibility_badges(processed, Gem::Version.new(min_ruby.to_s))
    +  min_ruby_version = Gem::Version.new(min_ruby.to_s)
    +  processed = add_supported_versioned_engine_badges(processed, min_ruby_version, workflow_paths) if workflow_paths
    +  processed = remove_incompatible_compatibility_badges(processed, min_ruby_version)
       processed = normalize_compatibility_rows(processed)
       prune_unused_compatibility_reference_definitions(processed)
     end
    @@ -1032,19 +1406,19 @@

    -737 -738 -739 -740 -741 -742 -743 -744 -745 -746

    +889 +890 +891 +892 +893 +894 +895 +896 +897 +898
    -
    # File 'lib/kettle/jem.rb', line 737
    +      
    # File 'lib/kettle/jem.rb', line 889
     
     def prune_orphaned_workflow_inline_references(content)
       defined_labels = markdown_link_definition_owners(content).map { |owner| owner.label.to_s }.to_set
    @@ -1076,18 +1450,18 @@ 

    -727 -728 -729 -730 -731 -732 -733 -734 -735

    +879 +880 +881 +882 +883 +884 +885 +886 +887
    -
    # File 'lib/kettle/jem.rb', line 727
    +      
    # File 'lib/kettle/jem.rb', line 879
     
     def prune_unused_compatibility_reference_definitions(content)
       referenced_labels = markdown_inline_reference_owners(content).flat_map(&:labels).to_h { |label| [label, true] }
    @@ -1118,12 +1492,12 @@ 

     
     
    -694
    -695
    -696
    +846 +847 +848

    -
    # File 'lib/kettle/jem.rb', line 694
    +      
    # File 'lib/kettle/jem.rb', line 846
     
     def remove_badge_occurrences(content, label)
       remove_markdown_inline_references(content, label)
    @@ -1148,34 +1522,34 @@ 

     
     
    -615
    -616
    -617
    -618
    -619
    -620
    -621
    -622
    -623
    -624
    -625
    -626
    -627
    -628
    -629
    -630
    -631
    -632
    -633
    -634
    -635
    -636
    -637
    -638
    -639
    +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727

    -
    # File 'lib/kettle/jem.rb', line 615
    +      
    # File 'lib/kettle/jem.rb', line 703
     
     def remove_disabled_engine_content(content, engines)
       enabled = Array(engines).map { |engine| engine.to_s.strip.downcase }
    @@ -1222,19 +1596,19 @@ 

    -668 -669 -670 -671 -672 -673 -674 -675 -676 -677

    +820 +821 +822 +823 +824 +825 +826 +827 +828 +829
    -
    # File 'lib/kettle/jem.rb', line 668
    +      
    # File 'lib/kettle/jem.rb', line 820
     
     def remove_incompatible_compatibility_badges(content, min_ruby)
       markdown_inline_reference_owners(content).flat_map(&:labels).uniq.each do |label|
    @@ -1266,30 +1640,30 @@ 

     
     
    -784
    -785
    -786
    -787
    -788
    -789
    -790
    -791
    -792
    -793
    -794
    -795
    -796
    -797
    -798
    -799
    -800
    -801
    -802
    -803
    -804
    +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960

    -
    # File 'lib/kettle/jem.rb', line 784
    +      
    # File 'lib/kettle/jem.rb', line 940
     
     def remove_markdown_inline_references(content, label)
       lines = content.to_s.lines
    @@ -1332,16 +1706,16 @@ 

     
     
    -806
    -807
    -808
    -809
    -810
    -811
    -812
    +962 +963 +964 +965 +966 +967 +968

    -
    # File 'lib/kettle/jem.rb', line 806
    +      
    # File 'lib/kettle/jem.rb', line 962
     
     def remove_markdown_table_rows(content)
       lines = content.to_s.lines
    @@ -1370,19 +1744,19 @@ 

     
     
    -641
    -642
    -643
    -644
    -645
    -646
    -647
    -648
    -649
    -650
    +729 +730 +731 +732 +733 +734 +735 +736 +737 +738

    -
    # File 'lib/kettle/jem.rb', line 641
    +      
    # File 'lib/kettle/jem.rb', line 729
     
     def remove_missing_workflow_badges(content, workflow_paths)
       existing = Array(workflow_paths).map { |path| path.to_s.delete_prefix("./") }.to_set
    @@ -1414,12 +1788,12 @@ 

     
     
    -664
    -665
    -666
    +752 +753 +754

    -
    # File 'lib/kettle/jem.rb', line 664
    +      
    # File 'lib/kettle/jem.rb', line 752
     
     def remove_workflow_badge_occurrences(content, workflow_label)
       remove_markdown_inline_references(content, workflow_label)
    @@ -1444,13 +1818,13 @@ 

     
     
    -689
    -690
    -691
    -692
    +841 +842 +843 +844

    -
    # File 'lib/kettle/jem.rb', line 689
    +      
    # File 'lib/kettle/jem.rb', line 841
     
     def ruby_minor_version(version)
       segments = version.segments
    @@ -1459,6 +1833,97 @@ 

    + + +
    +

    + + .versioned_engine_badge_compatible?(badge, min_ruby) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +770
    +771
    +772
    +773
    +
    +
    # File 'lib/kettle/jem.rb', line 770
    +
    +def versioned_engine_badge_compatible?(badge, min_ruby)
    +  badge_min_mri = ENGINE_COMPATIBILITY_MRI_VERSION.dig(badge.fetch(:engine), badge.fetch(:version))
    +  badge_min_mri && ruby_minor_version(badge_min_mri) >= ruby_minor_version(min_ruby)
    +end
    +
    +
    + +
    +

    + + .workflow_definition_base_url(content) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +813
    +814
    +815
    +816
    +817
    +818
    +
    +
    # File 'lib/kettle/jem.rb', line 813
    +
    +def workflow_definition_base_url(content)
    +  markdown_link_definition_owners(content).filter_map do |owner|
    +    url = owner.url.to_s
    +    url.split("/actions/workflows/", 2).first if url.include?("/actions/workflows/")
    +  end.first
    +end
    +
    @@ -1476,20 +1941,20 @@

     
     
    -652
    -653
    -654
    -655
    -656
    -657
    -658
    -659
    -660
    -661
    -662
    +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750

    -
    # File 'lib/kettle/jem.rb', line 652
    +      
    # File 'lib/kettle/jem.rb', line 740
     
     def workflow_references(content)
       markdown_link_definition_owners(content).each_with_object({}) do |owner, references|
    @@ -1512,9 +1977,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/RubyGemsResolver.html b/gems/kettle-jem/docs/Kettle/Jem/RubyGemsResolver.html index 4a70966d6..ec6b612f3 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/RubyGemsResolver.html +++ b/gems/kettle-jem/docs/Kettle/Jem/RubyGemsResolver.html @@ -6,7 +6,7 @@ Class: Kettle::Jem::RubyGemsResolver - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -389,15 +389,15 @@

     
     
    -821
    -822
    -823
    -824
    -825
    -826
    +977 +978 +979 +980 +981 +982

    -
    # File 'lib/kettle/jem.rb', line 821
    +      
    # File 'lib/kettle/jem.rb', line 977
     
     def initialize(cache: {}, http_get: nil, v1_api_base: RUBYGEMS_V1_API_BASE, v2_api_base: RUBYGEMS_V2_API_BASE)
       @cache = cache
    @@ -442,12 +442,12 @@ 

     
     
    -819
    -820
    -821
    +975 +976 +977

    -
    # File 'lib/kettle/jem.rb', line 819
    +      
    # File 'lib/kettle/jem.rb', line 975
     
     def cache
       @cache
    @@ -479,19 +479,19 @@ 

     
     
    -897
    -898
    -899
    -900
    -901
    -902
    -903
    -904
    -905
    -906
    +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062

    -
    # File 'lib/kettle/jem.rb', line 897
    +      
    # File 'lib/kettle/jem.rb', line 1053
     
     def fetch_gem_info(gem_name, version)
       cache_key = "info:#{gem_name}:#{version}"
    @@ -546,19 +546,19 @@ 

     
     
    -886
    -887
    -888
    -889
    -890
    -891
    -892
    -893
    -894
    -895
    +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051

    -
    # File 'lib/kettle/jem.rb', line 886
    +      
    # File 'lib/kettle/jem.rb', line 1042
     
     def fetch_versions(gem_name)
       cache_key = "versions:#{gem_name}"
    @@ -590,13 +590,13 @@ 

     
     
    -863
    -864
    -865
    -866
    +1019 +1020 +1021 +1022

    -
    # File 'lib/kettle/jem.rb', line 863
    +      
    # File 'lib/kettle/jem.rb', line 1019
     
     def min_ruby_version(gem_name, version)
       entry = fetch_versions(gem_name).find { |candidate| candidate["number"].to_s == version.to_s }
    @@ -622,26 +622,26 @@ 

     
     
    -868
    -869
    -870
    -871
    -872
    -873
    -874
    -875
    -876
    -877
    -878
    -879
    -880
    -881
    -882
    -883
    -884
    +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040

    -
    # File 'lib/kettle/jem.rb', line 868
    +      
    # File 'lib/kettle/jem.rb', line 1024
     
     def minor_versions_by_major(gem_name, requirements: nil)
       versions(gem_name, requirements: requirements).each_with_object({}) do |entry, grouped|
    @@ -680,23 +680,23 @@ 

     
     
    -908
    -909
    -910
    -911
    -912
    -913
    -914
    -915
    -916
    -917
    -918
    -919
    -920
    -921
    +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077

    -
    # File 'lib/kettle/jem.rb', line 908
    +      
    # File 'lib/kettle/jem.rb', line 1064
     
     def parse_min_ruby(requirement)
       return if requirement.to_s.strip.empty?
    @@ -732,26 +732,26 @@ 

     
     
    -845
    -846
    -847
    -848
    -849
    -850
    -851
    -852
    -853
    -854
    -855
    -856
    -857
    -858
    -859
    -860
    -861
    +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017

    -
    # File 'lib/kettle/jem.rb', line 845
    +      
    # File 'lib/kettle/jem.rb', line 1001
     
     def version_info(gem_name, version)
       data = fetch_gem_info(gem_name, version)
    @@ -790,25 +790,25 @@ 

     
     
    -828
    -829
    -830
    -831
    -832
    -833
    -834
    -835
    -836
    -837
    -838
    -839
    -840
    -841
    -842
    -843
    +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999

    -
    # File 'lib/kettle/jem.rb', line 828
    +      
    # File 'lib/kettle/jem.rb', line 984
     
     def versions(gem_name, include_prerelease: false, requirements: nil)
       requirement = normalize_requirements(requirements)
    @@ -836,9 +836,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/SelfTest.html b/gems/kettle-jem/docs/Kettle/Jem/SelfTest.html index 57525d67a..42f227bd7 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/SelfTest.html +++ b/gems/kettle-jem/docs/Kettle/Jem/SelfTest.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::SelfTest - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -108,9 +108,9 @@

    Defined Under Namespace

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/SelfTest/Manifest.html b/gems/kettle-jem/docs/Kettle/Jem/SelfTest/Manifest.html index 14e70d3b7..31b2f25e2 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/SelfTest/Manifest.html +++ b/gems/kettle-jem/docs/Kettle/Jem/SelfTest/Manifest.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::SelfTest::Manifest - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -172,27 +172,27 @@

     
     
    -1798
    -1799
    -1800
    -1801
    -1802
    -1803
    -1804
    -1805
    -1806
    -1807
    -1808
    -1809
    -1810
    -1811
    -1812
    -1813
    -1814
    -1815
    +1957 +1958 +1959 +1960 +1961 +1962 +1963 +1964 +1965 +1966 +1967 +1968 +1969 +1970 +1971 +1972 +1973 +1974

    -
    # File 'lib/kettle/jem.rb', line 1798
    +      
    # File 'lib/kettle/jem.rb', line 1957
     
     def compare(before, after)
       all_keys = (before.keys | after.keys).sort
    @@ -232,25 +232,25 @@ 

     
     
    -1781
    -1782
    -1783
    -1784
    -1785
    -1786
    -1787
    -1788
    -1789
    -1790
    -1791
    -1792
    -1793
    -1794
    -1795
    -1796
    +1940 +1941 +1942 +1943 +1944 +1945 +1946 +1947 +1948 +1949 +1950 +1951 +1952 +1953 +1954 +1955

    -
    # File 'lib/kettle/jem.rb', line 1781
    +      
    # File 'lib/kettle/jem.rb', line 1940
     
     def generate(dir)
       result = {}
    @@ -278,9 +278,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/SelfTest/Reporter.html b/gems/kettle-jem/docs/Kettle/Jem/SelfTest/Reporter.html index 64979ee0c..29857e77d 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/SelfTest/Reporter.html +++ b/gems/kettle-jem/docs/Kettle/Jem/SelfTest/Reporter.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::SelfTest::Reporter - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -218,25 +218,25 @@

     
     
    -1882
    -1883
    -1884
    -1885
    -1886
    -1887
    -1888
    -1889
    -1890
    -1891
    -1892
    -1893
    -1894
    -1895
    -1896
    -1897
    +2041 +2042 +2043 +2044 +2045 +2046 +2047 +2048 +2049 +2050 +2051 +2052 +2053 +2054 +2055 +2056

    -
    # File 'lib/kettle/jem.rb', line 1882
    +      
    # File 'lib/kettle/jem.rb', line 2041
     
     def append_self_test_table(lines, title, paths, status = nil)
       return if paths.empty?
    @@ -274,30 +274,30 @@ 

     
     
    -1899
    -1900
    -1901
    -1902
    -1903
    -1904
    -1905
    -1906
    -1907
    -1908
    -1909
    -1910
    -1911
    -1912
    -1913
    +2058 +2059 +2060 +2061 +2062 +2063 +2064 +2065 +2066 +2067 +2068 +2069 +2070 +2071 +2072

    -
    # File 'lib/kettle/jem.rb', line 1899
    +      
    # File 'lib/kettle/jem.rb', line 2058
     
     def append_skipped_files(lines, skipped)
       return if skipped.empty?
     
       lines << ""
    -  lines << "<details>"
    +  lines << '<details markdown="1">'
       lines << "<summary>Not Templated (#{skipped.size} files) - source-only files not produced by the template task</summary>"
       lines << ""
       lines << "These files are part of the gem source and are not expected to appear in the template output."
    @@ -328,21 +328,21 @@ 

     
     
    -1821
    -1822
    -1823
    -1824
    -1825
    -1826
    -1827
    -1828
    -1829
    -1830
    -1831
    -1832
    +1980 +1981 +1982 +1983 +1984 +1985 +1986 +1987 +1988 +1989 +1990 +1991

    -
    # File 'lib/kettle/jem.rb', line 1821
    +      
    # File 'lib/kettle/jem.rb', line 1980
     
     def diff(file_a, file_b)
       a = File.exist?(file_a.to_s) ? file_a.to_s : File::NULL
    @@ -376,56 +376,56 @@ 

     
     
    -1834
    -1835
    -1836
    -1837
    -1838
    -1839
    -1840
    -1841
    -1842
    -1843
    -1844
    -1845
    -1846
    -1847
    -1848
    -1849
    -1850
    -1851
    -1852
    -1853
    -1854
    -1855
    -1856
    -1857
    -1858
    -1859
    -1860
    -1861
    -1862
    -1863
    -1864
    -1865
    -1866
    -1867
    -1868
    -1869
    -1870
    -1871
    -1872
    -1873
    -1874
    -1875
    -1876
    -1877
    -1878
    -1879
    -1880
    +1993 +1994 +1995 +1996 +1997 +1998 +1999 +2000 +2001 +2002 +2003 +2004 +2005 +2006 +2007 +2008 +2009 +2010 +2011 +2012 +2013 +2014 +2015 +2016 +2017 +2018 +2019 +2020 +2021 +2022 +2023 +2024 +2025 +2026 +2027 +2028 +2029 +2030 +2031 +2032 +2033 +2034 +2035 +2036 +2037 +2038 +2039

    -
    # File 'lib/kettle/jem.rb', line 1834
    +      
    # File 'lib/kettle/jem.rb', line 1993
     
     def summary(comparison, output_dir:, templating_environment: nil, diff_count: nil, now: Time.now)
       matched = comparison.fetch(:matched, [])
    @@ -484,9 +484,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/Tasks.html b/gems/kettle-jem/docs/Kettle/Jem/Tasks.html index f9e5541ae..4968e455e 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/Tasks.html +++ b/gems/kettle-jem/docs/Kettle/Jem/Tasks.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::Tasks - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -110,9 +110,9 @@

    Defined Under Namespace

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/Tasks/InstallTask.html b/gems/kettle-jem/docs/Kettle/Jem/Tasks/InstallTask.html index e0fdd8a19..da9b6115b 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/Tasks/InstallTask.html +++ b/gems/kettle-jem/docs/Kettle/Jem/Tasks/InstallTask.html @@ -5,9 +5,9 @@ Module: Kettle::Jem::Tasks::InstallTask - - — Documentation by YARD 0.9.44 - + + — Documentation by YARD 0.9.45 + @@ -37,16 +37,16 @@

    Module: Kettle::Jem::Tasks::InstallTask - - - + + +

    + + + + + + + - - - - - - - - +
    Defined in:
    lib/kettle/jem/tasks/install_task.rb
    - +
    - +

    Constant Summary collapse

    - +
    CURATED_BINSTUB_GEMS = - +
    %w[appraisal2 rake rbs rspec-core yard kettle-dev kettle-test kettle-soup-cover stone_checksums].freeze
    - +
    CURATED_BINSTUB_DISCRETE_EXECUTABLES = - +
    %w[
       kettle-drift
       yard
     ].freeze
    - +
    DEFAULT_GIT_DRIVER_DEFINITIONS = - +
    [
       {
         language: "ruby",
         pattern: "*.rb",
    -    diff: "smorg-ruby",
    -    merge: "smorg-ruby",
    -    diff_command: "smorg-ruby diff-driver",
    -    merge_command: "smorg-ruby merge-driver %O %A %B %P"
    +    diff: "smorg-rb",
    +    merge: "smorg-rb",
    +    diff_command: "smorg-rb diff-driver",
    +    merge_command: "smorg-rb merge-driver %O %A %B %P"
       },
       {
         language: "go",
    @@ -137,22 +137,23 @@ 

    merge_command: "smorg-rs merge-driver %O %A %B %P" } ].freeze

    - +
    GIT_DRIVER_LANGUAGE_REGISTRY = - +
    DEFAULT_GIT_DRIVER_DEFINITIONS.to_h { |definition| [definition.fetch(:language), definition] }.freeze
    - +
    BUILTIN_GIT_DIFF_ATTRIBUTES = - +
    [
       {path: ".gitattributes", pattern: "*.rb", attributes: {"diff" => "ruby"}},
       {path: ".gitattributes", pattern: "*.go", attributes: {"diff" => "golang"}},
       {path: ".gitattributes", pattern: "*.rs", attributes: {"diff" => "rust"}}
     ].freeze
    - +
    + @@ -160,2325 +161,2835 @@

    - - +

    Class Method Summary collapse

    + + +
    +

    Class Method Details

    + +
    +

    + + .apply_direct_sibling_lockfile_env!(project_root, command_env) ⇒ Object + + + +

    + + + + +
    +
     
     
    -    
    -
    - - - - - - - +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 783
     
    +def apply_direct_sibling_lockfile_env!(project_root, command_env)
    +  gemspec_path = Dir.glob(File.join(project_root.to_s, "*.gemspec")).min
    +  return unless gemspec_path
    +
    +   = Kettle::Jem.send(:project_gemspec_metadata, project_root, gemspec_path)
    +  package_name = [:gem_name] || ["gem_name"] || File.basename(gemspec_path, ".gemspec")
    +  direct_sibling_gems = Kettle::Jem.send(
    +    :direct_sibling_runtime_gems,
    +    project_root,
    +    ,
    +    package_name: package_name
    +  )
    +  return if direct_sibling_gems.empty?
    +
    +  source_url = [:source_code_uri] || ["source_code_uri"] ||
    +    [:homepage] || ["homepage"]
    +  workspace_slug = Kettle::Jem.send(:direct_sibling_workspace_slug, source_url, project_root)
    +  prefix = workspace_slug.to_s.upcase.tr("-", "_")
    +  prefix = "LOCAL" if prefix.empty?
    +  dev_env = "#{prefix}_DEV"
    +  command_env[dev_env] = File.expand_path("..", project_root.to_s) if local_env_disabled?(command_env[dev_env])
    +end
    +
    +
    + +
    +

    + + .apply_kettle_family_local_install_env!(command_env) ⇒ Object + + -
    -

    Class Method Details

    + +

    + + + + +
    +
     
     
    -      
    -

    +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045

    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1032
     
    -    .bin_setup_command(project_root, quiet:)  ⇒ Object
    +def apply_kettle_family_local_install_env!(command_env)
    +  return unless command_env.fetch("K_JEM_TEMPLATING", "false").casecmp("true").zero?
     
    +  marker = kettle_family_local_install_marker(command_env)
    +  return unless Array(marker["installed_members"]).include?("kettle-jem")
     
    +  members_root = marker["members_root"].to_s
    +  if !command_env.key?("STRUCTUREDMERGE_DEV") && Dir.exist?(File.join(members_root, "kettle-jem"))
    +    command_env["STRUCTUREDMERGE_DEV"] = members_root
    +  end
     
    +  kettle_root = kettle_family_dependency_root(marker)
    +  command_env["KETTLE_DEV_DEV"] = kettle_root if kettle_root && !command_env.key?("KETTLE_DEV_DEV")
    +end
    +
    +
    + +
    +

    + + .bin_setup_command(project_root, quiet:) ⇒ Object + + +

     
     
    -1376
    -1377
    -1378
    -1379
    -1380
    +1586 +1587 +1588 +1589 +1590
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1376
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1586
     
     def bin_setup_command(project_root, quiet:)
       command = [File.join("bin", "setup")]
    @@ -2489,38 +3000,38 @@ 

    - +

    + + .binstub_files(bin_dir) ⇒ Object + - .binstub_files(bin_dir) ⇒ Object - - - - + +

     
     
    -782
    -783
    -784
    -785
    -786
    -787
    -788
    -789
    -790
    -791
    -792
    -793
    -794
    +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 782
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 926
     
     def binstub_files(bin_dir)
       return [] unless File.directory?(bin_dir)
    @@ -2539,62 +3050,62 @@ 

    - +

    + + .bootstrap_commit_step(project_root, run_options:) ⇒ Object + - .bootstrap_commit_step(project_root, run_options:) ⇒ Object - - - - + +

     
     
    -1299
    -1300
    -1301
    -1302
    -1303
    -1304
    -1305
    -1306
    -1307
    -1308
    -1309
    -1310
    -1311
    -1312
    -1313
    -1314
    -1315
    -1316
    -1317
    -1318
    -1319
    -1320
    -1321
    -1322
    -1323
    -1324
    -1325
    -1326
    -1327
    -1328
    -1329
    -1330
    -1331
    -1332
    -1333
    -1334
    -1335
    +1498 +1499 +1500 +1501 +1502 +1503 +1504 +1505 +1506 +1507 +1508 +1509 +1510 +1511 +1512 +1513 +1514 +1515 +1516 +1517 +1518 +1519 +1520 +1521 +1522 +1523 +1524 +1525 +1526 +1527 +1528 +1529 +1530 +1531 +1532 +1533 +1534
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1299
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1498
     
     def bootstrap_commit_step(project_root, run_options:)
       if Kettle::Jem::DecisionPolicy.value_to_boolean((run_options || {})[:skip_commit])
    @@ -2637,81 +3148,192 @@ 

    - +

    + + .bundle_binstubs_command(project_root = Dir.pwd, env: ENV) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +613
    +614
    +615
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 613
    +
    +def bundle_binstubs_command(project_root = Dir.pwd, env: ENV)
    +  %w[bundle binstubs] + curated_binstub_gems_in_bundle(project_root, env: env)
    +end
    +
    +
    + +
    +

    + + .bundle_includes_gem?(project_root, gem_name, env: ENV) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    - .bundle_binstubs_commandObject +
    + + + + +
    +
     
     
    +625
    +626
    +627
    +628
    +629
    +630
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 625
    +
    +def bundle_includes_gem?(project_root, gem_name, env: ENV)
    +  stdout, _stderr, status = Open3.capture3(env.to_h, "bundle", "list", "--name-only", chdir: project_root.to_s)
    +  return true unless status.success?
     
    +  stdout.lines.map(&:strip).include?(gem_name.to_s)
    +end
    +
    +
    + +
    +

    + + .bundled_handoff_command(run_options) ⇒ Object + + +

     
     
    -606
    -607
    -608
    +1566 +1567 +1568 +1569 +1570 +1571 +1572 +1573 +1574 +1575
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 606
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1566
     
    -def bundle_binstubs_command
    -  %w[bundle binstubs] + CURATED_BINSTUB_GEMS
    +def bundled_handoff_command(run_options)
    +  [
    +    "bundle",
    +    "exec",
    +    "ruby",
    +    "-e",
    +    %(load Gem.bin_path("kettle-jem", "kettle-jem")),
    +    "--"
    +  ] + handoff_argv(run_options)
     end
    - +

    + + .bundled_handoff_step(project_root:, env:, run_options:) ⇒ Object + - .bundled_handoff_step(project_root:, env:, run_options:) ⇒ Object - - - - + +

     
     
    -1272
    -1273
    -1274
    -1275
    -1276
    -1277
    -1278
    -1279
    -1280
    -1281
    -1282
    -1283
    -1284
    -1285
    -1286
    -1287
    -1288
    -1289
    -1290
    -1291
    -1292
    -1293
    -1294
    -1295
    -1296
    -1297
    +1463 +1464 +1465 +1466 +1467 +1468 +1469 +1470 +1471 +1472 +1473 +1474 +1475 +1476 +1477 +1478 +1479 +1480 +1481 +1482 +1483 +1484 +1485 +1486 +1487 +1488 +1489 +1490 +1491 +1492 +1493 +1494 +1495 +1496
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1272
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1463
     
     def bundled_handoff_step(project_root:, env:, run_options:)
       if Kettle::Jem::DecisionPolicy.value_to_boolean((run_options || {})[:bootstrap_mode])
    @@ -2732,9 +3354,17 @@ 

    } end + unless bundle_includes_gem?(project_root, "kettle-jem", env: setup_command_env(project_root, env)) + return { + name: "bundled_handoff", + status: "skipped", + reason: "kettle_jem_not_in_bundle" + } + end + { name: "bundled_handoff", - command: ["bundle", "exec", "kettle-jem"] + handoff_argv(run_options), + command: bundled_handoff_command(run_options), status: "ready", reason: "ready_for_orchestration" } @@ -2743,40 +3373,40 @@

    - +

    + + .bundler_binstub_gem_name(path) ⇒ Object + - .bundler_binstub_gem_name(path) ⇒ Object - - - - + +

     
     
    -810
    -811
    -812
    -813
    -814
    -815
    -816
    -817
    -818
    -819
    -820
    -821
    -822
    -823
    -824
    +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 810
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 954
     
     def bundler_binstub_gem_name(path)
       content = File.read(path)
    @@ -2797,37 +3427,37 @@ 

    - +

    + + .bundler_generated_binstub?(path) ⇒ Boolean + - .bundler_generated_binstub?(path) ⇒ Boolean - - - - + +

    - +
    - +

    Returns:

      - +
    • - - + + (Boolean) - - - + + +
    • - +
    @@ -2836,14 +3466,14 @@

     
     
    -804
    -805
    -806
    -807
    -808
    +948 +949 +950 +951 +952

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 804
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 948
     
     def bundler_generated_binstub?(path)
       File.read(path, 512).include?("This file was generated by Bundler")
    @@ -2854,29 +3484,22 @@ 

    - +

    + + .cleanup_legacy_ruby_version_files(project_root) ⇒ Object + - .cleanup_legacy_ruby_version_files(project_root) ⇒ Object - - - - + +

     
     
    -265
    -266
    -267
    -268
    -269
    -270
    -271
     272
     273
     274
    @@ -2885,10 +3508,17 @@ 

    277 278 279 -280

    +280 +281 +282 +283 +284 +285 +286 +287
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 265
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 272
     
     def cleanup_legacy_ruby_version_files(project_root)
       return nil unless File.file?(File.join(project_root.to_s, "mise.toml"))
    @@ -2910,37 +3540,37 @@ 

    - +

    + + .config_bootstrap_changed?(report) ⇒ Boolean + - .config_bootstrap_changed?(report) ⇒ Boolean - - - - + +

    - +
    - +

    Returns:

      - +
    • - - + + (Boolean) - - - + + +
    • - +
    @@ -2949,60 +3579,56 @@

     
     
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    +80 +81 +82 +83 +84

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 73
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 80
     
     def config_bootstrap_changed?(report)
       report.fetch(:recipe_reports, []).any? do |recipe_report|
    -    recipe_report.fetch(:relative_path, nil) == Kettle::Jem::KETTLE_CONFIG_PATH &&
    -      recipe_report.fetch(:recipe_name, nil) == "kettle_config_bootstrap" &&
    -      recipe_report.fetch(:changed, false)
    +    recipe_report.fetch(:relative_path, nil) == Kettle::Jem::KETTLE_CONFIG_PATH && recipe_report.fetch(:changed, false)
       end
     end
    - +

    + + .configured_project_grapheme(project_root, env) ⇒ Object + - .configured_project_grapheme(project_root, env) ⇒ Object - - - - + +

     
     
    -360
    -361
    -362
    -363
    -364
    -365
    -366
     367
     368
     369
     370
     371
    -372
    +372 +373 +374 +375 +376 +377 +378 +379
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 360
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 367
     
     def configured_project_grapheme(project_root, env)
       env_value = (env || {})["KJ_PROJECT_EMOJI"].to_s.strip
    @@ -3021,41 +3647,41 @@ 

    - +

    + + .conflicting_git_attribute_diagnostics(content, updates, managed_block:) ⇒ Object + - .conflicting_git_attribute_diagnostics(content, updates, managed_block:) ⇒ Object - - - - + +

     
     
    -1243
    -1244
    -1245
    -1246
    -1247
    -1248
    -1249
    -1250
    -1251
    -1252
    -1253
    -1254
    -1255
    -1256
    -1257
    -1258
    +1434 +1435 +1436 +1437 +1438 +1439 +1440 +1441 +1442 +1443 +1444 +1445 +1446 +1447 +1448 +1449
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1243
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1434
     
     def conflicting_git_attribute_diagnostics(content, updates, managed_block:)
       lines = remove_git_attribute_managed_block(content, managed_block: managed_block).fetch(:lines)
    @@ -3077,98 +3703,172 @@ 

    - +

    + + .curated_binstub?(path) ⇒ Boolean + - .curated_binstub?(path) ⇒ Boolean - - - - + +

    - +
    - +

    Returns:

      - +
    • + + + (Boolean) + + + +
    • + +
    +
    + + + + +
    +
     
    -        (Boolean)
     
    +940
    +941
    +942
    +943
    +944
    +945
    +946
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 940
     
    +def curated_binstub?(path)
    +  basename = File.basename(path)
    +  return true if CURATED_BINSTUB_DISCRETE_EXECUTABLES.include?(basename)
     
    -    
    +  gem_name = bundler_binstub_gem_name(path)
    +  !gem_name.to_s.empty? && CURATED_BINSTUB_GEMS.include?(gem_name)
    +end
    +
    +
    + +
    +

    + + .curated_binstub_gems_in_bundle(project_root = Dir.pwd, env: ENV) ⇒ Object + - + -

    + +
    + + +
     
     
    -796
    -797
    -798
    -799
    -800
    -801
    -802
    +617 +618 +619 +620 +621 +622 +623 +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 617
    +
    +def curated_binstub_gems_in_bundle(project_root = Dir.pwd, env: ENV)
    +  stdout, _stderr, status = Open3.capture3(env.to_h, "bundle", "list", "--name-only", chdir: project_root.to_s)
    +  return CURATED_BINSTUB_GEMS unless status.success?
    +
    +  bundled = stdout.lines.map(&:strip).reject(&:empty?)
    +  CURATED_BINSTUB_GEMS & bundled
    +end
    +
    +
    + +
    +

    + + .current_git_branch(path) ⇒ Object + + + + + +

    + +
    +
    +
    +
    +756
    +757
    +758
    +759
    +760
    +761
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 796
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 756
     
    -def curated_binstub?(path)
    -  basename = File.basename(path)
    -  return true if CURATED_BINSTUB_DISCRETE_EXECUTABLES.include?(basename)
    +def current_git_branch(path)
    +  stdout, _stderr, status = Open3.capture3("git", "-C", path.to_s, "branch", "--show-current")
    +  return "" unless status.success?
     
    -  gem_name = bundler_binstub_gem_name(path)
    -  !gem_name.to_s.empty? && CURATED_BINSTUB_GEMS.include?(gem_name)
    +  stdout.to_s.strip
     end
    - +

    + + .decorative_grapheme?(grapheme) ⇒ Boolean + - .decorative_grapheme?(grapheme) ⇒ Boolean - - - - + +

    - +
    - +

    Returns:

      - +
    • - - + + (Boolean) - - - + + +
    • - +
    @@ -3177,15 +3877,15 @@

     
     
    -441
    -442
    -443
    -444
    -445
    -446
    +448 +449 +450 +451 +452 +453

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 441
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 448
     
     def decorative_grapheme?(grapheme)
       value = grapheme.to_s
    @@ -3197,34 +3897,34 @@ 

    - +

    + + .default_git_driver_global_commandsObject + - .default_git_driver_global_commandsObject - - - - + +

     
     
    -1121
    -1122
    -1123
    -1124
    -1125
    -1126
    -1127
    -1128
    -1129
    +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1121
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1312
     
     def default_git_driver_global_commands
       DEFAULT_GIT_DRIVER_DEFINITIONS.flat_map do |definition|
    @@ -3239,31 +3939,31 @@ 

    - +

    + + .development_dependency_names(content) ⇒ Object + - .development_dependency_names(content) ⇒ Object - - - - + +

     
     
    -148
    -149
    -150
    -151
    -152
    -153
    +153 +154 +155 +156 +157 +158
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 148
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 153
     
     def development_dependency_names(content)
       Kettle::Jem.gemspec_dependency_records(content)
    @@ -3275,37 +3975,37 @@ 

    - +

    + + .dirty_git_attribute_managed_block?(content, managed_block) ⇒ Boolean + - .dirty_git_attribute_managed_block?(content, managed_block) ⇒ Boolean - - - - + +

    - +
    - +

    Returns:

      - +
    • - - + + (Boolean) - - - + + +
    • - +
    @@ -3314,15 +4014,15 @@

     
     
    -1236
    -1237
    -1238
    -1239
    -1240
    -1241
    +1427 +1428 +1429 +1430 +1431 +1432

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1236
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1427
     
     def dirty_git_attribute_managed_block?(content, managed_block)
       start_line = git_attribute_block_start(managed_block)
    @@ -3334,38 +4034,38 @@ 

    - +

    + + .ensure_bin_setup_executable(project_root) ⇒ Object + - .ensure_bin_setup_executable(project_root) ⇒ Object - - - - + +

     
     
    -205
    -206
    -207
    -208
    -209
    -210
    -211
     212
     213
     214
     215
     216
    -217
    +217 +218 +219 +220 +221 +222 +223 +224
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 205
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 212
     
     def ensure_bin_setup_executable(project_root)
       path = File.join(project_root, "bin", "setup")
    @@ -3384,43 +4084,43 @@ 

    - +

    + + .ensure_curated_binstubs_executable(project_root) ⇒ Object + - .ensure_curated_binstubs_executable(project_root) ⇒ Object - - - - + +

     
     
    -744
    -745
    -746
    -747
    -748
    -749
    -750
    -751
    -752
    -753
    -754
    -755
    -756
    -757
    -758
    -759
    -760
    -761
    +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 744
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 888
     
     def ensure_curated_binstubs_executable(project_root)
       bin_dir = File.join(project_root.to_s, "bin")
    @@ -3444,29 +4144,22 @@ 

    - +

    + + .ensure_env_local_gitignore(project_root) ⇒ Object + - .ensure_env_local_gitignore(project_root) ⇒ Object - - - - + +

     
     
    -549
    -550
    -551
    -552
    -553
    -554
    -555
     556
     557
     558
    @@ -3486,10 +4179,17 @@ 

    572 573 574 -575

    +575 +576 +577 +578 +579 +580 +581 +582
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 549
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 556
     
     def ensure_env_local_gitignore(project_root)
       return nil unless File.file?(File.join(project_root.to_s, ".env.local.example"))
    @@ -3522,37 +4222,37 @@ 

    - +

    + + .execute_git_drivers_check_step(step, project_root:, env:, quiet:, command_runner:) ⇒ Object + - .execute_git_drivers_check_step(step, project_root:, env:, quiet:, command_runner:) ⇒ Object - - - - + +

    - +
    - +

    Raises:

    @@ -3561,29 +4261,29 @@

     
     
    -1510
    -1511
    -1512
    -1513
    -1514
    -1515
    -1516
    -1517
    -1518
    -1519
    -1520
    -1521
    -1522
    -1523
    -1524
    -1525
    -1526
    -1527
    -1528
    -1529
    - -

    +
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1510
    +1731
    +1732
    +1733
    +1734
    +1735
    +1736
    +1737
    +1738
    +1739
    +1740
    +1741
    +1742
    +1743
    +1744
    +1745
    +1746
    +1747
    +1748
    +1749
    +1750
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1731
     
     def execute_git_drivers_check_step(step, project_root:, env:, quiet:, command_runner:)
       missing = []
    @@ -3609,73 +4309,73 @@ 

    - +

    + + .execute_git_drivers_step(step, project_root:, env:, quiet:, command_runner:) ⇒ Object + - .execute_git_drivers_step(step, project_root:, env:, quiet:, command_runner:) ⇒ Object - - - - + +

    - +
     
     
    -1461
    -1462
    -1463
    -1464
    -1465
    -1466
    -1467
    -1468
    -1469
    -1470
    -1471
    -1472
    -1473
    -1474
    -1475
    -1476
    -1477
    -1478
    -1479
    -1480
    -1481
    -1482
    -1483
    -1484
    -1485
    -1486
    -1487
    -1488
    -1489
    -1490
    -1491
    -1492
    -1493
    -1494
    -1495
    -1496
    -1497
    -1498
    -1499
    -1500
    -1501
    -1502
    -1503
    -1504
    -1505
    -1506
    -1507
    -1508
    -
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1461
    +1682
    +1683
    +1684
    +1685
    +1686
    +1687
    +1688
    +1689
    +1690
    +1691
    +1692
    +1693
    +1694
    +1695
    +1696
    +1697
    +1698
    +1699
    +1700
    +1701
    +1702
    +1703
    +1704
    +1705
    +1706
    +1707
    +1708
    +1709
    +1710
    +1711
    +1712
    +1713
    +1714
    +1715
    +1716
    +1717
    +1718
    +1719
    +1720
    +1721
    +1722
    +1723
    +1724
    +1725
    +1726
    +1727
    +1728
    +1729
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1682
     
     def execute_git_drivers_step(step, project_root:, env:, quiet:, command_runner:)
       return step unless step.fetch(:status) == "ready"
    @@ -3729,42 +4429,42 @@ 

    - +

    + + .execute_hook_templates_step(step, project_root:, env:, quiet:, command_runner:) ⇒ Object + - .execute_hook_templates_step(step, project_root:, env:, quiet:, command_runner:) ⇒ Object - - - - - -

    - -
    -
    -
    +  
     
    -1443
    -1444
    -1445
    -1446
    -1447
    -1448
    -1449
    -1450
    -1451
    -1452
    -1453
    -1454
    -1455
    -1456
    -1457
    -1458
    -1459
    + + + +
    +
    +
    +
    +1664
    +1665
    +1666
    +1667
    +1668
    +1669
    +1670
    +1671
    +1672
    +1673
    +1674
    +1675
    +1676
    +1677
    +1678
    +1679
    +1680
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1443
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1664
     
     def execute_hook_templates_step(step, project_root:, env:, quiet:, command_runner:)
       return step unless step.fetch(:status) == "ready"
    @@ -3787,57 +4487,81 @@ 

    - +

    + + .execute_orchestration_steps(install_steps, project_root:, env:, run_options:, command_runner:, event_phase: "install") ⇒ Object + - .execute_orchestration_steps(install_steps, project_root:, env:, run_options:, command_runner:) ⇒ Object - - - - + +

     
     
    -840
    -841
    -842
    -843
    -844
    -845
    -846
    -847
    -848
    -849
    -850
    -851
    -852
    -853
    -854
    -855
    -856
    -857
    -858
    -859
    -860
    +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 840
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 984
     
    -def execute_orchestration_steps(install_steps, project_root:, env:, run_options:, command_runner:)
    +def execute_orchestration_steps(install_steps, project_root:, env:, run_options:, command_runner:, event_phase: "install")
       quiet = Kettle::Jem::DecisionPolicy.value_to_boolean(run_options[:quiet])
    +  events = Kettle::Jem.event_stream_from_options(run_options)
       install_steps.map do |step|
    -    case step.fetch(:name)
    +    Kettle::Jem.emit_step_event(
    +      events,
    +      "command_step",
    +      step.merge(status: "started"),
    +      phase: event_phase
    +    )
    +    result = case step.fetch(:name)
         when "mise_trust"
           execute_ready_command_step(step, project_root: project_root, env: env, quiet: quiet, command_runner: command_runner)
         when "bundled_handoff"
           execute_ready_command_step(step, project_root: project_root, env: env, quiet: quiet, command_runner: command_runner)
         when "bundle_lock_normalization"
           execute_ready_command_step(step, project_root: project_root, env: env, quiet: quiet, command_runner: command_runner)
    +    when "rubocop_lts_local_branch"
    +      execute_ready_command_step(step, project_root: project_root, env: env, quiet: quiet, command_runner: command_runner)
    +    when "rubocop_gradual_autocorrect"
    +      execute_ready_command_step(step, project_root: project_root, env: env, quiet: quiet, command_runner: command_runner)
         when "hook_templates"
           execute_hook_templates_step(step, project_root: project_root, env: env, quiet: quiet, command_runner: command_runner)
         when "git_drivers"
    @@ -3847,43 +4571,45 @@ 

    else step end + Kettle::Jem.emit_step_event(events, "command_step", result, phase: event_phase) + result end end

    - +

    + + .execute_ready_command_step(step, project_root:, env:, quiet:, command_runner:) ⇒ Object + - .execute_ready_command_step(step, project_root:, env:, quiet:, command_runner:) ⇒ Object - - - - + +

    - +
    - +

    Raises:

    @@ -3892,24 +4618,24 @@

     
     
    -1406
    -1407
    -1408
    -1409
    -1410
    -1411
    -1412
    -1413
    -1414
    -1415
    -1416
    -1417
    -1418
    -1419
    -1420
    +1616 +1617 +1618 +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628 +1629 +1630

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1406
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1616
     
     def execute_ready_command_step(step, project_root:, env:, quiet:, command_runner:)
       return step unless step.fetch(:status) == "ready"
    @@ -3930,49 +4656,71 @@ 

    - +

    + + .execute_ready_commands_step(step, project_root:, env:, quiet:, command_runner:) ⇒ Object + - .execute_ready_commands_step(step, project_root:, env:, quiet:, command_runner:) ⇒ Object - - - - + +

    - +
     
     
    -1422
    -1423
    -1424
    -1425
    -1426
    -1427
    -1428
    -1429
    -1430
    -1431
    -1432
    -1433
    -1434
    -1435
    -1436
    -1437
    -1438
    -1439
    -1440
    -1441
    -
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1422
    +1632
    +1633
    +1634
    +1635
    +1636
    +1637
    +1638
    +1639
    +1640
    +1641
    +1642
    +1643
    +1644
    +1645
    +1646
    +1647
    +1648
    +1649
    +1650
    +1651
    +1652
    +1653
    +1654
    +1655
    +1656
    +1657
    +1658
    +1659
    +1660
    +1661
    +1662
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1632
     
     def execute_ready_commands_step(step, project_root:, env:, quiet:, command_runner:)
       return step unless step.fetch(:status) == "ready"
     
    +  if step.fetch(:name) == "bootstrap_commit"
    +    dirty_entries = git_output(project_root, "status", "--porcelain").lines.map(&:chomp).reject(&:empty?)
    +    if dirty_entries.empty?
    +      return step.merge(
    +        status: "clean_noop",
    +        dirty_entries: [],
    +        reason: "clean_before_execution"
    +      )
    +    end
    +  end
    +
       command_env = step.fetch(:env, env)
       results = step.fetch(:commands).map do |command|
         result = command_runner.call(command, chdir: project_root, env: command_env, quiet: quiet)
    @@ -3994,28 +4742,28 @@ 

    - +

    + + .first_grapheme(text) ⇒ Object + - .first_grapheme(text) ⇒ Object - - - - + +

     
     
    -437
    -438
    -439
    +444 +445 +446
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 437
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 444
     
     def first_grapheme(text)
       text.to_s.strip[/\A\X/u].to_s
    @@ -4024,36 +4772,36 @@ 

    - +

    + + .followup_apply_after_config_bootstrap(project_root, env:, run_options:, report:) ⇒ Object + - .followup_apply_after_config_bootstrap(project_root, env:, run_options:, report:) ⇒ Object - - - - + +

     
     
    -61
    -62
    -63
    -64
    -65
    -66
    -67
     68
     69
     70
    -71
    +71 +72 +73 +74 +75 +76 +77 +78
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 61
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 68
     
     def followup_apply_after_config_bootstrap(project_root, env:, run_options:, report:)
       return report unless config_bootstrap_changed?(report)
    @@ -4070,27 +4818,22 @@ 

    - +

    + + .gemspec_dependency_sync_step(report) ⇒ Object + - .gemspec_dependency_sync_step(report) ⇒ Object - - - - + +

     
     
    -128
    -129
    -130
    -131
    -132
     133
     134
     135
    @@ -4104,10 +4847,15 @@ 

    143 144 145 -146

    +146 +147 +148 +149 +150 +151
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 128
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 133
     
     def gemspec_dependency_sync_step(report)
       gemspec_report = report.fetch(:recipe_reports, []).find do |recipe_report|
    @@ -4132,29 +4880,22 @@ 

    - +

    + + .gemspec_grapheme_assignment_replacements(content, grapheme) ⇒ Object + - .gemspec_grapheme_assignment_replacements(content, grapheme) ⇒ Object - - - - + +

    - + @@ -93,9 +93,9 @@

    Additional Support

    diff --git a/gems/kettle-jem/docs/frames.html b/gems/kettle-jem/docs/frames.html index 3223dddda..4a6186cad 100644 --- a/gems/kettle-jem/docs/frames.html +++ b/gems/kettle-jem/docs/frames.html @@ -2,7 +2,7 @@ - Documentation by YARD 0.9.44 + Documentation by YARD 0.9.45
     
     
    -398
    -399
    -400
    -401
    -402
    -403
    -404
     405
     406
     407
    @@ -4163,10 +4904,17 @@ 

    # File 'lib/kettle/jem/tasks/install_task.rb', line 398 +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 405
     
     def gemspec_grapheme_assignment_replacements(content, grapheme)
       Kettle::Jem.ruby_call_records(content, nil).filter_map do |call|
    @@ -4188,31 +4936,31 @@ 

    + + .gemspec_name(content, gemspec_path) ⇒ Object + - .gemspec_name(content, gemspec_path) ⇒ Object - - - - + +

     
     
    -542
    -543
    -544
    -545
    -546
    -547
    +549 +550 +551 +552 +553 +554
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 542
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 549
     
     def gemspec_name(content, gemspec_path)
       Kettle::Jem.gemspec_assignment_records(content, receiver: "spec")
    @@ -4224,28 +4972,28 @@ 

    - +

    + + .git_attribute_block_end(managed_block) ⇒ Object + - .git_attribute_block_end(managed_block) ⇒ Object - - - - + +

     
     
    -1581
    -1582
    -1583
    +1802 +1803 +1804
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1581
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1802
     
     def git_attribute_block_end(managed_block)
       "# <</#{managed_block}>>"
    @@ -4254,28 +5002,28 @@ 

    - +

    + + .git_attribute_block_start(managed_block) ⇒ Object + - .git_attribute_block_start(managed_block) ⇒ Object - - - - + +

     
     
    -1577
    -1578
    -1579
    +1798 +1799 +1800
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1577
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1798
     
     def git_attribute_block_start(managed_block)
       "# <<#{managed_block}>> do not edit below this line"
    @@ -4284,37 +5032,37 @@ 

    - +

    + + .git_attribute_line_conflicts?(line, update) ⇒ Boolean + - .git_attribute_line_conflicts?(line, update) ⇒ Boolean - - - - + +

    - +
    - +

    Returns:

      - +
    • - - + + (Boolean) - - - + + +
    • - +
    @@ -4323,20 +5071,20 @@

     
     
    -1260
    -1261
    -1262
    -1263
    -1264
    -1265
    -1266
    -1267
    -1268
    -1269
    -1270
    +1451 +1452 +1453 +1454 +1455 +1456 +1457 +1458 +1459 +1460 +1461

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1260
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1451
     
     def git_attribute_line_conflicts?(line, update)
       parts = line.to_s.strip.split
    @@ -4353,43 +5101,43 @@ 

    - +

    + + .git_driver_attribute_diagnostics(project_root, updates, managed_block:) ⇒ Object + - .git_driver_attribute_diagnostics(project_root, updates, managed_block:) ⇒ Object - - - - + +

     
     
    -1217
    -1218
    -1219
    -1220
    -1221
    -1222
    -1223
    -1224
    -1225
    -1226
    -1227
    -1228
    -1229
    -1230
    -1231
    -1232
    -1233
    -1234
    +1408 +1409 +1410 +1411 +1412 +1413 +1414 +1415 +1416 +1417 +1418 +1419 +1420 +1421 +1422 +1423 +1424 +1425
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1217
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1408
     
     def git_driver_attribute_diagnostics(project_root, updates, managed_block:)
       path = File.join(project_root.to_s, ".gitattributes")
    @@ -4413,31 +5161,31 @@ 

    - +

    + + .git_driver_attribute_reason(diagnostics, dry_run:, ready:) ⇒ Object + - .git_driver_attribute_reason(diagnostics, dry_run:, ready:) ⇒ Object - - - - + +

     
     
    -1210
    -1211
    -1212
    -1213
    -1214
    -1215
    +1401 +1402 +1403 +1404 +1405 +1406
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1210
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1401
     
     def git_driver_attribute_reason(diagnostics, dry_run:, ready:)
       return "git_driver_attribute_conflict" if diagnostics.any? { |diagnostic| diagnostic.fetch(:key) == "conflicting_attributes" }
    @@ -4449,30 +5197,30 @@ 

    - +

    + + .git_driver_attribute_status(diagnostics, dry_run:) ⇒ Object + - .git_driver_attribute_status(diagnostics, dry_run:) ⇒ Object - - - - + +

     
     
    -1204
    -1205
    -1206
    -1207
    -1208
    +1395 +1396 +1397 +1398 +1399
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1204
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1395
     
     def git_driver_attribute_status(diagnostics, dry_run:)
       return "blocked" if diagnostics.any? { |diagnostic| diagnostic.fetch(:blocking, false) }
    @@ -4483,35 +5231,35 @@ 

    - +

    + + .git_driver_attribute_updates(manifest, profile) ⇒ Object + - .git_driver_attribute_updates(manifest, profile) ⇒ Object - - - - + +

     
     
    -1095
    -1096
    -1097
    -1098
    -1099
    -1100
    -1101
    -1102
    -1103
    -1104
    +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1095
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1286
     
     def git_driver_attribute_updates(manifest, profile)
       profile_hash = git_driver_manifest_profile(manifest, profile)
    @@ -4527,33 +5275,33 @@ 

    - +

    + + .git_driver_forge_warning_diagnosticObject + - .git_driver_forge_warning_diagnosticObject - - - - + +

     
     
    -1086
    -1087
    -1088
    -1089
    -1090
    -1091
    -1092
    -1093
    +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1086
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1277
     
     def git_driver_forge_warning_diagnostic
       {
    @@ -4567,33 +5315,33 @@ 

    - +

    + + .git_driver_global_commands(manifest = nil, profile = "semantic-diff") ⇒ Object + - .git_driver_global_commands(manifest = nil, profile = "semantic-diff") ⇒ Object - - - - + +

     
     
    -1106
    -1107
    -1108
    -1109
    -1110
    -1111
    -1112
    -1113
    +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1106
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1297
     
     def git_driver_global_commands(manifest = nil, profile = "semantic-diff")
       profile_hash = git_driver_manifest_profile(manifest, profile)
    @@ -4607,30 +5355,30 @@ 

    - +

    + + .git_driver_global_config_checks(manifest = nil, profile = "semantic-diff") ⇒ Object + - .git_driver_global_config_checks(manifest = nil, profile = "semantic-diff") ⇒ Object - - - - + +

     
     
    -1141
    -1142
    -1143
    -1144
    -1145
    +1332 +1333 +1334 +1335 +1336
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1141
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1332
     
     def git_driver_global_config_checks(manifest = nil, profile = "semantic-diff")
       git_driver_global_commands(manifest, profile).map do |command|
    @@ -4641,41 +5389,41 @@ 

    - +

    + + .git_driver_global_unset_commandsObject + - .git_driver_global_unset_commandsObject - - - - + +

     
     
    -1131
    -1132
    -1133
    -1134
    -1135
    -1136
    -1137
    -1138
    -1139
    +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1329 +1330
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1131
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1322
     
     def git_driver_global_unset_commands
       DEFAULT_GIT_DRIVER_DEFINITIONS.flat_map do |definition|
         [
    -      ["git", "config", "--global", "--unset", "diff.#{definition.fetch(:diff)}.command"],
    -      ["git", "config", "--global", "--unset", "merge.#{definition.fetch(:merge)}.driver"],
    -      ["git", "config", "--global", "--unset", "merge.#{definition.fetch(:merge)}.name"]
    +      ["git", "config", "--global", "--unset-all", "diff.#{definition.fetch(:diff)}.command"],
    +      ["git", "config", "--global", "--unset-all", "merge.#{definition.fetch(:merge)}.driver"],
    +      ["git", "config", "--global", "--unset-all", "merge.#{definition.fetch(:merge)}.name"]
         ]
       end
     end
    @@ -4683,30 +5431,30 @@

    - +

    + + .git_driver_local_commands(manifest = nil, profile = "semantic-diff") ⇒ Object + - .git_driver_local_commands(manifest = nil, profile = "semantic-diff") ⇒ Object - - - - + +

     
     
    -1115
    -1116
    -1117
    -1118
    -1119
    +1306 +1307 +1308 +1309 +1310
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1115
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1306
     
     def git_driver_local_commands(manifest = nil, profile = "semantic-diff")
       git_driver_global_commands(manifest, profile).map do |command|
    @@ -4717,30 +5465,30 @@ 

    - +

    + + .git_driver_local_config_checks(manifest = nil, profile = "semantic-diff") ⇒ Object + - .git_driver_local_config_checks(manifest = nil, profile = "semantic-diff") ⇒ Object - - - - + +

     
     
    -1147
    -1148
    -1149
    -1150
    -1151
    +1338 +1339 +1340 +1341 +1342
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1147
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1338
     
     def git_driver_local_config_checks(manifest = nil, profile = "semantic-diff")
       git_driver_local_commands(manifest, profile).map do |command|
    @@ -4751,35 +5499,35 @@ 

    - +

    + + .git_driver_manifest(project_root) ⇒ Object + - .git_driver_manifest(project_root) ⇒ Object - - - - + +

     
     
    -1153
    -1154
    -1155
    -1156
    -1157
    -1158
    -1159
    -1160
    -1161
    -1162
    +1344 +1345 +1346 +1347 +1348 +1349 +1350 +1351 +1352 +1353
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1153
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1344
     
     def git_driver_manifest(project_root)
       path = File.join(project_root.to_s, ".structuredmerge", "git-drivers.toml")
    @@ -4795,30 +5543,30 @@ 

    - +

    + + .git_driver_manifest_profile(manifest, profile) ⇒ Object + - .git_driver_manifest_profile(manifest, profile) ⇒ Object - - - - + +

     
     
    -1164
    -1165
    -1166
    -1167
    -1168
    +1355 +1356 +1357 +1358 +1359
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1164
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1355
     
     def git_driver_manifest_profile(manifest, profile)
       return nil unless manifest
    @@ -4829,120 +5577,120 @@ 

    - +
    -

    - - .git_drivers_step(project_root, run_options) ⇒ Object - - - - - -

    - - - - + + @@ -924,10 +968,6 @@

    Workspace & Funding

    - - - - @@ -940,18 +980,10 @@

    Workspace & Funding

    - - - - - - - - @@ -1033,15 +1065,15 @@

    🌈 Contributors

    Also see GitLab Contributors: https://gitlab.com/structuredmerge/structuredmerge-ruby/-/graphs/main

    - ⭐️ Star History + ⭐️ Star History - - +

    + Star History Chart - +

    </a>

    @@ -1107,7 +1139,7 @@

    🤑 A request for help

    To say “thanks!” ☝️ Join the Discord or 👇️ send money.

    -

    Sponsor me on GitHub Sponsors 💌 Sponsor me on Liberapay 💌 Donate on PayPal

    +

    Sponsor galtzo-floss/kettle-jem on Open Source Collective 💌 Sponsor me on GitHub Sponsors 💌 Sponsor me on Liberapay 💌 Donate on PayPal

    Please give the project a star ⭐ ♥.

    @@ -1121,16 +1153,16 @@

    Please give the project a star ⭐ ♥ | Package | kettle-jem |
    | Description | 🔮 Kettle::Jem provides gem scaffolding, templating, and setup automation using the *-merge gem family for AST-based file merging and token-resolver for template token resolution. Includes MergerConfig presets, YAML recipes, and a complete gem template scaffold. |
    | Homepage | https://github.com/structuredmerge/structuredmerge-ruby |
    -| Source | https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.0.0 |
    +| Source | https://github.com/structuredmerge/structuredmerge-ruby |
    | License | AGPL-3.0-only OR PolyForm-Small-Business-1.0.0 |
    -| Funding | https://github.com/sponsors/pboling, https://issuehunt.io/u/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://patreon.com/galtzo, https://polar.sh/pboling, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/kettle-jem, https://www.buymeacoffee.com/pboling |
    +| Funding | https://github.com/sponsors/pboling, https://ko-fi.com/pboling, https://liberapay.com/pboling/donate, https://opencollective.com/galtzo-floss, https://thanks.dev/u/gh/pboling, https://tidelift.com/funding/github/rubygems/kettle-jem, https://www.buymeacoffee.com/pboling |

    diff --git a/gems/kettle-jem/docs/file.RRRRrb-Matrix.html b/gems/kettle-jem/docs/file.RRRRrb-Matrix.html index 250d511fc..4e2a1b5d8 100644 --- a/gems/kettle-jem/docs/file.RRRRrb-Matrix.html +++ b/gems/kettle-jem/docs/file.RRRRrb-Matrix.html @@ -6,7 +6,7 @@ File: RRRRrb-Matrix - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -397,10 +397,10 @@

    Support & Funding Info

    Buy me a coffeeDonate at ko-fi.com - +
    -
    -
    -
    -966
    -967
    -968
    -969
    -970
    -971
    -972
    -973
    -974
    -975
    -976
    -977
    -978
    -979
    -980
    -981
    -982
    -983
    -984
    -985
    -986
    -987
    -988
    -989
    -990
    -991
    -992
    -993
    -994
    -995
    -996
    -997
    -998
    -999
    -1000
    -1001
    -1002
    -1003
    -1004
    -1005
    -1006
    -1007
    -1008
    -1009
    -1010
    -1011
    -1012
    -1013
    -1014
    -1015
    -1016
    -1017
    -1018
    -1019
    -1020
    -1021
    -1022
    -1023
    -1024
    -1025
    -1026
    -1027
    -1028
    -1029
    -1030
    -1031
    -1032
    -1033
    -1034
    -1035
    -1036
    -1037
    -1038
    -1039
    -1040
    -1041
    -1042
    -1043
    -1044
    -1045
    -1046
    -1047
    -1048
    -1049
    -1050
    -1051
    -1052
    -1053
    -1054
    -1055
    -1056
    -1057
    -1058
    -1059
    -1060
    +

    + + .git_drivers_step(project_root, run_options) ⇒ Object + + + + + +

    + +
    +
    +
    +
    +1157
    +1158
    +1159
    +1160
    +1161
    +1162
    +1163
    +1164
    +1165
    +1166
    +1167
    +1168
    +1169
    +1170
    +1171
    +1172
    +1173
    +1174
    +1175
    +1176
    +1177
    +1178
    +1179
    +1180
    +1181
    +1182
    +1183
    +1184
    +1185
    +1186
    +1187
    +1188
    +1189
    +1190
    +1191
    +1192
    +1193
    +1194
    +1195
    +1196
    +1197
    +1198
    +1199
    +1200
    +1201
    +1202
    +1203
    +1204
    +1205
    +1206
    +1207
    +1208
    +1209
    +1210
    +1211
    +1212
    +1213
    +1214
    +1215
    +1216
    +1217
    +1218
    +1219
    +1220
    +1221
    +1222
    +1223
    +1224
    +1225
    +1226
    +1227
    +1228
    +1229
    +1230
    +1231
    +1232
    +1233
    +1234
    +1235
    +1236
    +1237
    +1238
    +1239
    +1240
    +1241
    +1242
    +1243
    +1244
    +1245
    +1246
    +1247
    +1248
    +1249
    +1250
    +1251
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 966
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1157
     
     def git_drivers_step(project_root, run_options)
       mode = normalize_git_drivers_mode((run_options || {})[:git_drivers])
    @@ -5043,29 +5791,29 @@ 

    - +

    + + .git_output(project_root, *args) ⇒ Object + - .git_output(project_root, *args) ⇒ Object - - - - + +

     
     
    -1342
    -1343
    -1344
    -1345
    +1541 +1542 +1543 +1544
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1342
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1541
     
     def git_output(project_root, *args)
       stdout, _stderr, status = Open3.capture3("git", "-C", project_root.to_s, *args)
    @@ -5075,37 +5823,37 @@ 

    - +

    + + .git_success?(project_root, *args) ⇒ Boolean + - .git_success?(project_root, *args) ⇒ Boolean - - - - + +

    - +
    - +

    Returns:

      - +
    • - - + + (Boolean) - - - + + +
    • - +
    @@ -5114,13 +5862,13 @@

     
     
    -1337
    -1338
    -1339
    -1340
    +1536 +1537 +1538 +1539

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1337
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1536
     
     def git_success?(project_root, *args)
       _stdout, _stderr, status = Open3.capture3("git", "-C", project_root.to_s, *args)
    @@ -5130,29 +5878,29 @@ 

    - +

    + + .git_toplevel(project_root) ⇒ Object + - .git_toplevel(project_root) ⇒ Object - - - - + +

     
     
    -826
    -827
    -828
    -829
    +970 +971 +972 +973
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 826
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 970
     
     def git_toplevel(project_root)
       stdout, _stderr, status = Open3.capture3("git", "-C", project_root.to_s, "rev-parse", "--show-toplevel")
    @@ -5162,32 +5910,32 @@ 

    - +

    + + .github_org_from_env(env) ⇒ Object + - .github_org_from_env(env) ⇒ Object - - - - + +

     
     
    -516
    -517
    -518
    -519
    -520
    -521
    -522
    +523 +524 +525 +526 +527 +528 +529
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 516
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 523
     
     def github_org_from_env(env)
       %w[FORGE_ORG KJ_GH_USER GITHUB_ORG].each do |key|
    @@ -5200,29 +5948,22 @@ 

    - +

    + + .github_org_from_origin(project_root) ⇒ Object + - .github_org_from_origin(project_root) ⇒ Object - - - - + +

     
     
    -524
    -525
    -526
    -527
    -528
    -529
    -530
     531
     532
     533
    @@ -5232,10 +5973,17 @@ 

    537 538 539 -540

    +540 +541 +542 +543 +544 +545 +546 +547
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 524
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 531
     
     def github_org_from_origin(project_root)
       stdout, _stderr, status = Open3.capture3("git", "-C", project_root.to_s, "remote", "get-url", "origin")
    @@ -5258,33 +6006,33 @@ 

    - +

    + + .github_workflow_paths(project_root) ⇒ Object + - .github_workflow_paths(project_root) ⇒ Object - - - - + +

     
     
    -317
    -318
    -319
    -320
    -321
    -322
    -323
    -324
    +324 +325 +326 +327 +328 +329 +330 +331
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 317
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 324
     
     def github_workflow_paths(project_root)
       workflow_root = File.join(project_root.to_s, ".github", "workflows")
    @@ -5298,44 +6046,44 @@ 

    - +

    + + .handoff_argv(run_options) ⇒ Object + - .handoff_argv(run_options) ⇒ Object - - - - + +

     
     
    -1347
    -1348
    -1349
    -1350
    -1351
    -1352
    -1353
    -1354
    -1355
    -1356
    -1357
    -1358
    -1359
    -1360
    -1361
    -1362
    -1363
    -1364
    -1365
    +1546 +1547 +1548 +1549 +1550 +1551 +1552 +1553 +1554 +1555 +1556 +1557 +1558 +1559 +1560 +1561 +1562 +1563 +1564
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1347
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1546
     
     def handoff_argv(run_options)
       options = run_options || {}
    @@ -5360,63 +6108,63 @@ 

    - +

    + + .hook_templates_step(project_root, run_options) ⇒ Object + - .hook_templates_step(project_root, run_options) ⇒ Object - - - - + +

     
     
    -883
    -884
    -885
    -886
    -887
    -888
    -889
    -890
    -891
    -892
    -893
    -894
    -895
    -896
    -897
    -898
    -899
    -900
    -901
    -902
    -903
    -904
    -905
    -906
    -907
    -908
    -909
    -910
    -911
    -912
    -913
    -914
    -915
    -916
    -917
    -918
    -919
    -920
    +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 883
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1074
     
     def hook_templates_step(project_root, run_options)
       mode = normalize_hook_templates_mode((run_options || {})[:hook_templates])
    @@ -5460,27 +6208,22 @@ 

    - +

    + + .install_phase_reports(install_steps) ⇒ Object + - .install_phase_reports(install_steps) ⇒ Object - - - - + +

     
     
    -160
    -161
    -162
    -163
    -164
     165
     166
     167
    @@ -5508,10 +6251,17 @@ 

    189 190 191 -192

    +192 +193 +194 +195 +196 +197 +198 +199
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 160
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 165
     
     def install_phase_reports(install_steps)
       phases = {
    @@ -5533,6 +6283,8 @@ 

    curated_binstubs_executable bundle_binstub_pruning bundle_binstub_location_validation + rubocop_lts_local_branch + rubocop_gradual_autocorrect bundle_lock_normalization ], "orchestration" => %w[bundled_handoff bootstrap_commit] @@ -5550,28 +6302,28 @@

    - +

    + + .install_run_options(env, run_options) ⇒ Object + - .install_run_options(env, run_options) ⇒ Object - - - - + +

     
     
    -57
    -58
    -59
    +64 +65 +66
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 57
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 64
     
     def install_run_options(env, run_options)
       Kettle::Jem::Tasks::TemplateTask.env_run_options(env || {}).merge(run_options || {})
    @@ -5580,35 +6332,35 @@ 

    - +

    + + .install_step_summary(install_steps) ⇒ Object + - .install_step_summary(install_steps) ⇒ Object - - - - + +

     
     
    -194
    -195
    -196
    -197
    -198
    -199
    -200
     201
     202
    -203
    +203 +204 +205 +206 +207 +208 +209 +210
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 194
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 201
     
     def install_step_summary(install_steps)
       statuses = install_steps.each_with_object(Hash.new(0)) do |step, counts|
    @@ -5624,27 +6376,22 @@ 

    - +

    + + .kettle_config_migration_step(project_root) ⇒ Object + - .kettle_config_migration_step(project_root) ⇒ Object - - - - + +

     
     
    -92
    -93
    -94
    -95
    -96
     97
     98
     99
    @@ -5674,10 +6421,15 @@ 

    123 124 125 -126

    +126 +127 +128 +129 +130 +131
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 92
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 97
     
     def kettle_config_migration_step(project_root)
       canonical_relative = Kettle::Jem::KETTLE_CONFIG_PATH
    @@ -5718,29 +6470,107 @@ 

    + +
    +

    + + .kettle_family_dependency_root(marker) ⇒ Object + + + + + +

    + + + + +
    +
    +
     
    +1057
    +1058
    +1059
    +1060
    +1061
    +1062
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1057
    +
    +def kettle_family_dependency_root(marker)
    +  Array(marker["local_dependencies"]).map(&:to_s).each do |path|
    +    return File.dirname(path) if File.basename(path) == "kettle-dev"
    +  end
    +  nil
    +end
    +
    +
    +
    -

    +

    + + .kettle_family_local_install_marker(command_env) ⇒ Object + + + + + +

    + + + + +
    +
     
    -    .list_arg(flag, value)  ⇒ Object
     
    +1047
    +1048
    +1049
    +1050
    +1051
    +1052
    +1053
    +1054
    +1055
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1047
     
    +def kettle_family_local_install_marker(command_env)
    +  path = command_env["KETTLE_FAMILY_LOCAL_INSTALL_MARKER"].to_s
    +  path = File.join(Dir.home, ".kettle-family", "local-install.json") if path.empty?
    +  return {} unless File.file?(path)
     
    +  JSON.parse(File.read(path))
    +rescue JSON::ParserError
    +  {}
    +end
    +
    +
    + +
    +

    + + .list_arg(flag, value) ⇒ Object + + +

     
     
    -1371
    -1372
    -1373
    -1374
    +1581 +1582 +1583 +1584
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1371
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1581
     
     def list_arg(flag, value)
       values = Array(value).flat_map { |entry| entry.to_s.split(",") }.map(&:strip).reject(&:empty?)
    @@ -5750,37 +6580,37 @@ 

    - +

    + + .literal_github_homepage?(assigned) ⇒ Boolean + - .literal_github_homepage?(assigned) ⇒ Boolean - - - - + +

    - +
    - +

    Returns:

      - +
    • - - + + (Boolean) - - - + + +
    • - +
    @@ -5789,22 +6619,22 @@

     
     
    -502
    -503
    -504
    -505
    -506
    -507
    -508
     509
     510
     511
     512
     513
    -514
    +514 +515 +516 +517 +518 +519 +520 +521

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 502
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 509
     
     def literal_github_homepage?(assigned)
       value = assigned.to_s.strip
    @@ -5823,28 +6653,81 @@ 

    - +
    -

    +

    + + .local_env_disabled?(value) ⇒ Boolean + + + + + +

    +
    + + - .lockfile_normalization_commandObject +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + + + + +
    +
     
     
    +1064
    +1065
    +1066
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1064
     
    +def local_env_disabled?(value)
    +  value.to_s.empty? || value.to_s.casecmp("false").zero?
    +end
    +
    +
    + +
    +

    + + .lockfile_normalization_commandObject + + +

     
     
    -636
    -637
    -638
    +658 +659 +660
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 636
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 658
     
     def lockfile_normalization_command
       %w[bundle update]
    @@ -5853,35 +6736,35 @@ 

    - +

    + + .merge_apply_reports(initial, followup) ⇒ Object + - .merge_apply_reports(initial, followup) ⇒ Object - - - - + +

     
     
    -81
    -82
    -83
    -84
    -85
     86
     87
     88
     89
    -90
    +90 +91 +92 +93 +94 +95
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 81
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 86
     
     def merge_apply_reports(initial, followup)
       merged = followup.merge(
    @@ -5897,37 +6780,37 @@ 

    - +

    + + .mise_installed?(env) ⇒ Boolean + - .mise_installed?(env) ⇒ Boolean - - - - + +

    - +
    - +

    Returns:

      - +
    • - - + + (Boolean) - - - + + +
    • - +
    @@ -5936,17 +6819,17 @@

     
     
    -246
    -247
    -248
    -249
    -250
    -251
    -252
    -253
    +253 +254 +255 +256 +257 +258 +259 +260

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 246
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 253
     
     def mise_installed?(env)
       path = (env || {})["PATH"].to_s
    @@ -5960,29 +6843,22 @@ 

    - +

    + + .mise_trust_step(project_root, report, env:) ⇒ Object + - .mise_trust_step(project_root, report, env:) ⇒ Object - - - - + +

     
     
    -219
    -220
    -221
    -222
    -223
    -224
    -225
     226
     227
     228
    @@ -6001,10 +6877,17 @@ 

    241 242 243 -244

    +244 +245 +246 +247 +248 +249 +250 +251
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 219
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 226
     
     def mise_trust_step(project_root, report, env:)
       mise_report = report.fetch(:recipe_reports, []).find do |recipe_report|
    @@ -6036,63 +6919,59 @@ 

    - +

    - - .normal_lockfile_env(env) ⇒ Object - - - - - -

    - - @@ -243,9 +429,9 @@

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/Tasks/SelfTestTask.html b/gems/kettle-jem/docs/Kettle/Jem/Tasks/SelfTestTask.html index 7e156c53c..8006ab2ab 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/Tasks/SelfTestTask.html +++ b/gems/kettle-jem/docs/Kettle/Jem/Tasks/SelfTestTask.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::Tasks::SelfTestTask - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -1332,9 +1332,9 @@

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/Tasks/TemplateTask.html b/gems/kettle-jem/docs/Kettle/Jem/Tasks/TemplateTask.html index f712b19eb..cad840c7b 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/Tasks/TemplateTask.html +++ b/gems/kettle-jem/docs/Kettle/Jem/Tasks/TemplateTask.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::Tasks::TemplateTask - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -241,9 +241,6 @@

     
     
    -34
    -35
    -36
     37
     38
     39
    @@ -261,10 +258,13 @@ 

    51 52 53 -54

    +54 +55 +56 +57

    @@ -512,12 +518,12 @@

     
     
    -56
    -57
    -58
    +59 +60 +61

    @@ -826,30 +826,30 @@

     
     
    -1727
    -1728
    -1729
    -1730
    -1731
    -1732
    -1733
    -1734
    -1735
    -1736
    -1737
    -1738
    -1739
    -1740
    -1741
    -1742
    -1743
    -1744
    -1745
    -1746
    -1747
    +1886 +1887 +1888 +1889 +1890 +1891 +1892 +1893 +1894 +1895 +1896 +1897 +1898 +1899 +1900 +1901 +1902 +1903 +1904 +1905 +1906

    @@ -892,18 +892,18 @@

     
     
    -1707
    -1708
    -1709
    -1710
    -1711
    -1712
    -1713
    -1714
    -1715
    +1866 +1867 +1868 +1869 +1870 +1871 +1872 +1873 +1874

    @@ -934,30 +934,30 @@

     
     
    -1608
    -1609
    -1610
    -1611
    -1612
    -1613
    -1614
    -1615
    -1616
    -1617
    -1618
    -1619
    -1620
    -1621
    -1622
    -1623
    -1624
    -1625
    -1626
    -1627
    -1628
    +1767 +1768 +1769 +1770 +1771 +1772 +1773 +1774 +1775 +1776 +1777 +1778 +1779 +1780 +1781 +1782 +1783 +1784 +1785 +1786 +1787

    - + @@ -188,20 +186,69 @@

    Compatibility

    may be higher than the gem’s runtime compatibility floor when legacy Rubies are
    not practical for the current toolchain.

    -
    -
    -
    -
    -640
    -641
    -642
    -643
    -644
    -645
    -646
    -647
    -648
    -649
    -650
    -651
    -652
    -653
    -654
    -655
    -656
    -657
    -658
    -659
    -660
    + + .normal_lockfile_env(project_root, env) ⇒ Object + + + + + + + +
    +
    +
    +
    +763
    +764
    +765
    +766
    +767
    +768
    +769
    +770
    +771
    +772
    +773
    +774
    +775
    +776
    +777
    +778
    +779
    +780
    +781
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 640
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 763
     
    -def normal_lockfile_env(env)
    +def normal_lockfile_env(project_root, env)
       command_env = (env || {}).to_h.dup
    +  strip_inherited_bundler_activation!(command_env)
       command_env["K_JEM_TEMPLATING"] = "false"
    -  %w[KETTLE_RB_DEV GALTZO_FLOSS_DEV STRUCTUREDMERGE_DEV].each do |key|
    +  %w[KETTLE_DEV_DEV GALTZO_FLOSS_DEV STRUCTUREDMERGE_DEV].each do |key|
         command_env[key] = "false" if command_env.key?(key)
       end
    +  gemfile = File.join(project_root.to_s, "Gemfile")
    +  command_env["BUNDLE_GEMFILE"] = gemfile if File.file?(gemfile)
    +  apply_direct_sibling_lockfile_env!(project_root, command_env)
       %w[
    -    BUNDLE_BIN_PATH
    -    BUNDLE_LOCKFILE
    -    BUNDLER_VERSION
    -    BUNDLER_SETUP
         BUNDLE_PATH
         BUNDLE_WITH
         BUNDLE_WITHOUT
    -    RUBYLIB
    -    RUBYOPT
       ].each do |key|
         command_env[key] = nil
       end
    @@ -6102,29 +6981,29 @@ 

    - +

    + + .normalize_gemspec_grapheme(content, grapheme) ⇒ Object + - .normalize_gemspec_grapheme(content, grapheme) ⇒ Object - - - - + +

     
     
    -393
    -394
    -395
    -396
    +400 +401 +402 +403
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 393
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 400
     
     def normalize_gemspec_grapheme(content, grapheme)
       replacements = gemspec_grapheme_assignment_replacements(content, grapheme)
    @@ -6134,38 +7013,38 @@ 

    - +

    + + .normalize_git_drivers_mode(value) ⇒ Object + - .normalize_git_drivers_mode(value) ⇒ Object - - - - + +

     
     
    -1062
    -1063
    -1064
    -1065
    -1066
    -1067
    -1068
    -1069
    -1070
    -1071
    -1072
    -1073
    -1074
    +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1062
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1253
     
     def normalize_git_drivers_mode(value)
       normalized = value.to_s.strip.downcase.tr("_", "-")
    @@ -6184,34 +7063,34 @@ 

    - +

    + + .normalize_hook_templates_mode(value) ⇒ Object + - .normalize_hook_templates_mode(value) ⇒ Object - - - - + +

     
     
    -922
    -923
    -924
    -925
    -926
    -927
    -928
    -929
    -930
    +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 922
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1113
     
     def normalize_hook_templates_mode(value)
       normalized = value.to_s.strip.downcase
    @@ -6226,50 +7105,50 @@ 

    - +

    + + .normalize_lockfile_step(project_root, env:, run_options: {}) ⇒ Object + - .normalize_lockfile_step(project_root, env:, run_options: {}) ⇒ Object - - - - + +

     
     
    -610
    -611
    -612
    -613
    -614
    -615
    -616
    -617
    -618
    -619
    -620
    -621
    -622
    -623
    -624
    -625
    -626
    -627
    -628
    -629
    -630
    -631
     632
     633
    -634
    +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 610
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 632
     
     def normalize_lockfile_step(project_root, env:, run_options: {})
       if Kettle::Jem::DecisionPolicy.value_to_boolean((run_options || {})[:skip_lock_normalization])
    @@ -6292,7 +7171,7 @@ 

    name: "bundle_lock_normalization", command: lockfile_normalization_command, status: "ready", - env: normal_lockfile_env(env), + env: normal_lockfile_env(project_root, env), reason: "bundle_update_without_templating_overrides" } end

    @@ -6300,35 +7179,35 @@

    - +

    + + .normalize_readme_h1_grapheme(content, grapheme) ⇒ Object + - .normalize_readme_h1_grapheme(content, grapheme) ⇒ Object - - - - + +

     
     
    -382
    -383
    -384
    -385
    -386
    -387
    -388
     389
     390
    -391
    +391 +392 +393 +394 +395 +396 +397 +398
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 382
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 389
     
     def normalize_readme_h1_grapheme(content, grapheme)
       lines = content.to_s.split("\n", -1)
    @@ -6344,34 +7223,34 @@ 

    - +

    + + .post_template_project_fix_steps(project_root, report, env:) ⇒ Object + - .post_template_project_fix_steps(project_root, report, env:) ⇒ Object - - - - + +

     
     
    -255
    -256
    -257
    -258
    -259
    -260
    -261
     262
    -263
    +263 +264 +265 +266 +267 +268 +269 +270
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 255
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 262
     
     def post_template_project_fix_steps(project_root, report, env:)
       [
    @@ -6386,92 +7265,243 @@ 

    - +

    + + .prune_unwanted_bundler_binstubs(project_root) ⇒ Object + + + + + +

    + + + + +
    +
     
    -    .prune_unwanted_bundler_binstubs(project_root)  ⇒ Object
     
    +907
    +908
    +909
    +910
    +911
    +912
    +913
    +914
    +915
    +916
    +917
    +918
    +919
    +920
    +921
    +922
    +923
    +924
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 907
    +
    +def prune_unwanted_bundler_binstubs(project_root)
    +  bin_dir = File.join(project_root.to_s, "bin")
    +  removed = binstub_files(bin_dir).filter_map do |path|
    +    basename = File.basename(path)
    +    next if curated_binstub?(path)
    +    next unless bundler_generated_binstub?(path)
     
    +    FileUtils.rm_f(path)
    +    basename
    +  end
     
    +  {
    +    name: "bundle_binstub_pruning",
    +    status: removed.empty? ? "already_current" : "pruned",
    +    reason: removed.empty? ? "no_unwanted_bundler_binstubs" : "removed_unwanted_bundler_binstubs",
    +    removed_binstubs: removed.sort
    +  }
    +end
    +
    +
    + +
    +

    + + .quiet_command(command, quiet:) ⇒ Object + + +

    + + +
     
     
    -763
    -764
    -765
    -766
    -767
    -768
    -769
    -770
    -771
    -772
    -773
    -774
    -775
    -776
    -777
    -778
    -779
    -780
    +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828 +1829 +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1819
    +
    +def quiet_command(command, quiet:)
    +  argv = command.map(&:to_s)
    +  return argv unless quiet
    +  return argv unless argv.first == "bundle"
    +  return argv if argv.include?("--quiet")
    +
    +  subcommand = argv[1]
    +  return [*argv, "--quiet"] if %w[install update].include?(subcommand)
    +
    +  argv
    +end
    +
    +
    + +
    +

    + + .quiet_command_env(env) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +1831
    +1832
    +1833
    +1834
    +1835
    +1836
    +1837
    +1838
    +1839
    +1840
    +1841
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1831
    +
    +def quiet_command_env(env)
    +  (env || {}).to_h.merge(
    +    "DEBUG" => "false",
    +    "KETTLE_JEM_DEBUG" => "false",
    +    "KETTLE_DEV_DEBUG" => "false",
    +    "BUNDLE_IGNORE_MESSAGES" => "true",
    +    "BUNDLE_SILENCE_DEPRECATIONS" => "true",
    +    "BUNDLE_SILENCE_ROOT_WARNING" => "true",
    +    "BUNDLE_VERBOSE" => "false"
    +  )
    +end
    +
    +
    + +
    +

    + + .rake_task_available?(project_root, task_name) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    + +
    + +
    +
    +
    +
    +692
    +693
    +694
    +695
    +696
    +697
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 763
    -
    -def prune_unwanted_bundler_binstubs(project_root)
    -  bin_dir = File.join(project_root.to_s, "bin")
    -  removed = binstub_files(bin_dir).filter_map do |path|
    -    basename = File.basename(path)
    -    next if curated_binstub?(path)
    -    next unless bundler_generated_binstub?(path)
    -
    -    FileUtils.rm_f(path)
    -    basename
    -  end
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 692
     
    -  {
    -    name: "bundle_binstub_pruning",
    -    status: removed.empty? ? "already_current" : "pruned",
    -    reason: removed.empty? ? "no_unwanted_bundler_binstubs" : "removed_unwanted_bundler_binstubs",
    -    removed_binstubs: removed.sort
    -  }
    +def rake_task_available?(project_root, task_name)
    +  stdout, _stderr, status = Open3.capture3("bin/rake", "--tasks", chdir: project_root.to_s)
    +  status.success? && stdout.lines.any? { |line| line.include?(task_name.to_s) }
    +rescue Errno::EACCES, Errno::ENOENT
    +  false
     end
    - +

    + + .readme_h1_grapheme(content) ⇒ Object + - .readme_h1_grapheme(content) ⇒ Object - - - - + +

     
     
    -374
    -375
    -376
    -377
    -378
    -379
    -380
    +381 +382 +383 +384 +385 +386 +387
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 374
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 381
     
     def readme_h1_grapheme(content)
       h1 = Kettle::Jem.markdown_heading_owners(content, source_label: "README.md").find { |owner| owner.level == 1 }
    @@ -6484,33 +7514,33 @@ 

    - +

    + + .relative_or_absolute_path(path, project_root) ⇒ Object + - .relative_or_absolute_path(path, project_root) ⇒ Object - - - - + +

     
     
    -831
    -832
    -833
    -834
    -835
    -836
    -837
    -838
    +975 +976 +977 +978 +979 +980 +981 +982
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 831
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 975
     
     def relative_or_absolute_path(path, project_root)
       expanded_path = File.expand_path(path.to_s)
    @@ -6524,45 +7554,45 @@ 

    - +

    + + .remove_git_attribute_managed_block(content, managed_block:) ⇒ Object + - .remove_git_attribute_managed_block(content, managed_block:) ⇒ Object - - - - + +

    - +
     
     
    -1551
    -1552
    -1553
    -1554
    -1555
    -1556
    -1557
    -1558
    -1559
    -1560
    -1561
    -1562
    -1563
    -1564
    -1565
    -1566
    -1567
    -1568
    -1569
    -1570
    -
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1551
    +1772
    +1773
    +1774
    +1775
    +1776
    +1777
    +1778
    +1779
    +1780
    +1781
    +1782
    +1783
    +1784
    +1785
    +1786
    +1787
    +1788
    +1789
    +1790
    +1791
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1772
     
     def remove_git_attribute_managed_block(content, managed_block:)
       start_line = git_attribute_block_start(managed_block)
    @@ -6588,29 +7618,29 @@ 

    - +

    + + .render_git_attribute_line(update) ⇒ Object + - .render_git_attribute_line(update) ⇒ Object - - - - + +

     
     
    -1572
    -1573
    -1574
    -1575
    +1793 +1794 +1795 +1796
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1572
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1793
     
     def render_git_attribute_line(update)
       attributes = update.fetch(:attributes).map { |key, value| "#{key}=#{value}" }.join(" ")
    @@ -6620,33 +7650,33 @@ 

    - +

    + + .render_git_attributes(content, updates, managed_block:) ⇒ Object + - .render_git_attributes(content, updates, managed_block:) ⇒ Object - - - - + +

     
     
    -1542
    -1543
    -1544
    -1545
    -1546
    -1547
    -1548
    -1549
    +1763 +1764 +1765 +1766 +1767 +1768 +1769 +1770
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1542
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1763
     
     def render_git_attributes(content, updates, managed_block:)
       unmanaged_lines = remove_git_attribute_managed_block(content, managed_block: managed_block).fetch(:lines)
    @@ -6660,35 +7690,35 @@ 

    - +

    + + .render_git_driver_include_config(config_entries) ⇒ Object + - .render_git_driver_include_config(config_entries) ⇒ Object - - - - + +

     
     
    -1531
    -1532
    -1533
    -1534
    -1535
    -1536
    -1537
    -1538
    -1539
    -1540
    +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1531
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1752
     
     def render_git_driver_include_config(config_entries)
       lines = ["# Generated by kettle-jem; do not commit this file."]
    @@ -6704,29 +7734,22 @@ 

    - +

    + + .repair_gemspec_homepage(project_root, env) ⇒ Object + - .repair_gemspec_homepage(project_root, env) ⇒ Object - - - - + +

     
     
    -448
    -449
    -450
    -451
    -452
    -453
    -454
     455
     456
     457
    @@ -6772,10 +7795,17 @@ 

    497 498 499 -500

    +500 +501 +502 +503 +504 +505 +506 +507
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 448
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 455
     
     def repair_gemspec_homepage(project_root, env)
       gemspec_path = Dir.glob(File.join(project_root.to_s, "*.gemspec")).min
    @@ -6834,63 +7864,246 @@ 

    - +

    + + .replace_character_ranges(content, replacements) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +427
    +428
    +429
    +430
    +431
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 427
    +
    +def replace_character_ranges(content, replacements)
    +  replacements.sort_by(&:first).reverse.reduce(content.to_s) do |updated, (start_character_offset, end_character_offset, replacement)|
    +    "#{updated[0...start_character_offset]}#{replacement}#{updated[end_character_offset..]}"
    +  end
    +end
    +
    +
    + +
    +

    + + .rewrite_yard_binstub(project_root) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +836
    +837
    +838
    +839
    +840
    +841
    +842
    +843
    +844
    +845
    +846
    +847
    +848
    +849
    +850
    +851
    +852
    +853
    +854
    +855
    +856
    +857
    +858
    +859
    +860
    +861
    +862
    +863
    +864
    +865
    +866
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 836
    +
    +def rewrite_yard_binstub(project_root)
    +  yard_binstub = File.join(project_root.to_s, "bin", "yard")
    +  unless File.file?(yard_binstub)
    +    return {
    +      name: "yard_binstub_rake_handoff",
    +      status: "skipped",
    +      reason: "missing_yard_binstub",
    +      path: "bin/yard"
    +    }
    +  end
    +
    +  content = yard_binstub_rake_handoff_content
    +  if File.read(yard_binstub) == content
    +    return {
    +      name: "yard_binstub_rake_handoff",
    +      status: "already_current",
    +      reason: "yard_binstub_already_runs_rake_yard",
    +      path: "bin/yard"
    +    }
    +  end
    +
    +  executable = File.executable?(yard_binstub)
    +  File.write(yard_binstub, content)
    +  FileUtils.chmod("+x", yard_binstub) if executable
    +  {
    +    name: "yard_binstub_rake_handoff",
    +    status: "updated",
    +    reason: "yard_plugins_require_rake_yard_postprocess_hooks",
    +    path: "bin/yard"
    +  }
    +end
    +
    +
    + +
    +

    + + .rubocop_gradual_autocorrect_commandObject + - .replace_character_ranges(content, replacements) ⇒ Object + + + +

    + + + + +
    +
     
     
    +688
    +689
    +690
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 688
     
    +def rubocop_gradual_autocorrect_command
    +  ["sh", "-c", "rm -f .rubocop_gradual.lock && bin/rake rubocop_gradual:autocorrect"]
    +end
    +
    +
    + +
    +

    + + .rubocop_gradual_autocorrect_step(project_root) ⇒ Object + + +

     
     
    -420
    -421
    -422
    -423
    -424
    +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 420
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 662
     
    -def replace_character_ranges(content, replacements)
    -  replacements.sort_by(&:first).reverse.reduce(content.to_s) do |updated, (start_offset, end_offset, replacement)|
    -    "#{updated[0...start_offset]}#{replacement}#{updated[end_offset..]}"
    +def rubocop_gradual_autocorrect_step(project_root)
    +  rakefile = File.join(project_root.to_s, "Rakefile")
    +  bin_rake = File.join(project_root.to_s, "bin", "rake")
    +  unless File.file?(rakefile) && File.file?(bin_rake)
    +    return {
    +      name: "rubocop_gradual_autocorrect",
    +      status: "skipped",
    +      reason: "missing_rake_entrypoint"
    +    }
    +  end
    +  unless rake_task_available?(project_root, "rubocop_gradual:autocorrect")
    +    return {
    +      name: "rubocop_gradual_autocorrect",
    +      status: "skipped",
    +      reason: "missing_rubocop_gradual_task"
    +    }
       end
    +
    +  {
    +    name: "rubocop_gradual_autocorrect",
    +    command: rubocop_gradual_autocorrect_command,
    +    status: "ready",
    +    reason: "post_template_style_normalization"
    +  }
     end
    - +
    -

    - - .rewrite_yard_binstub(project_root) ⇒ Object - - - +

    + + .rubocop_lts_local_branch_step(report, env:, project_root: nil) ⇒ Object + + +

     
     
    -692
    -693
    -694
    -695
    -696
    -697
    -698
     699
     700
     701
    @@ -6914,69 +8127,136 @@ 

    719 720 721 -722

    +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 692
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 699
     
    -def rewrite_yard_binstub(project_root)
    -  yard_binstub = File.join(project_root.to_s, "bin", "yard")
    -  unless File.file?(yard_binstub)
    +def rubocop_lts_local_branch_step(report, env:, project_root: nil)
    +  local_root = rubocop_lts_local_root(env)
    +  return nil unless local_root
    +
    +  ruby_gem = report.dig(:facts, :templates, :tokens, "KJ|RUBOCOP_RUBY_GEM").to_s
    +  branch = Kettle::Rb::CompatMatrix.rubocop_lts_branch_for_gem(ruby_gem)
    +  unless branch
    +    raise Kettle::Jem::Error, "Cannot select RUBOCOP_LTS_LOCAL branch for #{ruby_gem.inspect}"
    +  end
    +
    +  checkout = File.join(local_root, "rubocop-lts")
    +  if project_root && same_path?(project_root, checkout)
         return {
    -      name: "yard_binstub_rake_handoff",
    +      name: "rubocop_lts_local_branch",
           status: "skipped",
    -      reason: "missing_yard_binstub",
    -      path: "bin/yard"
    +      path: checkout,
    +      branch: branch,
    +      reason: "destination_is_rubocop_lts_checkout"
         }
       end
     
    -  content = yard_binstub_rake_handoff_content
    -  if File.read(yard_binstub) == content
    +  current = current_git_branch(checkout)
    +  if current == branch
         return {
    -      name: "yard_binstub_rake_handoff",
    +      name: "rubocop_lts_local_branch",
           status: "already_current",
    -      reason: "yard_binstub_already_runs_rake_yard",
    -      path: "bin/yard"
    +      path: checkout,
    +      branch: branch
         }
       end
     
    -  executable = File.executable?(yard_binstub)
    -  File.write(yard_binstub, content)
    -  FileUtils.chmod("+x", yard_binstub) if executable
       {
    -    name: "yard_binstub_rake_handoff",
    -    status: "updated",
    -    reason: "yard_plugins_require_rake_yard_postprocess_hooks",
    -    path: "bin/yard"
    +    name: "rubocop_lts_local_branch",
    +    command: %W[git -C #{checkout} switch #{branch}],
    +    status: "ready",
    +    path: checkout,
    +    current_branch: current,
    +    branch: branch,
    +    reason: "rubocop_lts_local_branch_matrix"
       }
     end
    - +
    -

    +

    + + .rubocop_lts_local_root(env) ⇒ Object + - .ruby_string_literal_content(value, quote) ⇒ Object + + +

    + + + + +
    +
    +
    +
    +747
    +748
    +749
    +750
    +751
    +752
    +753
    +754
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 747
     
    +def rubocop_lts_local_root(env)
    +  value = (env || {})["RUBOCOP_LTS_LOCAL"].to_s.strip
    +  return nil if value.empty? || Kettle::Jem::DecisionPolicy.falsey?(value)
    +  return File.join((env || {})["HOME"].to_s.empty? ? Dir.home : (env || {})["HOME"].to_s, "src", "rubocop-lts") if value.casecmp("true").zero? || value == "1" || value.casecmp("yes").zero? || value.casecmp("on").zero?
    +  return value if value.start_with?("/")
     
    +  File.join((env || {})["HOME"].to_s.empty? ? Dir.home : (env || {})["HOME"].to_s, value)
    +end
    +
    +
    + +
    +

    + + .ruby_string_literal_content(value, quote) ⇒ Object + + +

     
     
    -415
    -416
    -417
    -418
    +422 +423 +424 +425
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 415
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 422
     
     def ruby_string_literal_content(value, quote)
       escaped = value.to_s.gsub("\\", "\\\\\\\\")
    @@ -6986,24 +8266,22 @@ 

    - +

    + + .run(project_root: Dir.pwd, env: ENV, run_options: {}, command_runner: method(:run_system_command)) ⇒ Object + - .run(project_root: Dir.pwd, env: ENV, run_options: {}, command_runner: method(:run_system_command)) ⇒ Object - - - - + +

     
     
    -21
    -22
     23
     24
     25
    @@ -7036,10 +8314,17 @@ 

    52 53 54 -55

    +55 +56 +57 +58 +59 +60 +61 +62
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 21
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 23
     
     def run(project_root: Dir.pwd, env: ENV, run_options: {}, command_runner: method(:run_system_command))
       effective_run_options = install_run_options(env, run_options)
    @@ -7058,13 +8343,16 @@ 

    install_steps << git_drivers_step(project_root, effective_run_options) install_steps << ensure_bin_setup_executable(project_root) setup_env = setup_command_env(project_root, env) + rubocop_lts_branch_step = rubocop_lts_local_branch_step(report, env: setup_env, project_root: project_root) + install_steps << rubocop_lts_branch_step if rubocop_lts_branch_step install_steps.concat(run_bundle_setup_commands(project_root, env: setup_env, run_options: effective_run_options, command_runner: command_runner)) + install_steps << rubocop_gradual_autocorrect_step(project_root) install_steps << normalize_lockfile_step(project_root, env: setup_env, run_options: effective_run_options) install_steps << bundled_handoff_step(project_root: project_root, env: env, run_options: effective_run_options) install_steps << bootstrap_commit_step(project_root, run_options: effective_run_options) install_steps = execute_orchestration_steps(install_steps, project_root: project_root, env: setup_env, run_options: effective_run_options, command_runner: command_runner) - report.merge( + final_report = report.merge( mode: "install", installed: true, install_steps: install_steps, @@ -7075,34 +8363,29 @@

    message: "kettle:jem:install applied templates, completed local post-template checks, and executed available orchestration steps." }] ) + Kettle::Jem.emit_summary_event(Kettle::Jem.event_stream_from_options(effective_run_options), final_report) + final_report end

    - +

    + + .run_bundle_setup_commands(project_root, env:, run_options:, command_runner:) ⇒ Object + - .run_bundle_setup_commands(project_root, env:, run_options:, command_runner:) ⇒ Object - - - - + +

     
     
    -577
    -578
    -579
    -580
    -581
    -582
    -583
     584
     585
     586
    @@ -7123,10 +8406,17 @@ 

    601 602 603 -604

    +604 +605 +606 +607 +608 +609 +610 +611
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 577
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 584
     
     def run_bundle_setup_commands(project_root, env:, run_options:, command_runner:)
       quiet = Kettle::Jem::DecisionPolicy.value_to_boolean(run_options[:quiet])
    @@ -7141,7 +8431,7 @@ 

    ), run_command_step( "bundle_binstubs", - bundle_binstubs_command, + bundle_binstubs_command(project_root, env: env), project_root: project_root, env: env, quiet: quiet, @@ -7160,37 +8450,37 @@

    - +

    + + .run_command_step(name, command, project_root:, env:, quiet:, command_runner:) ⇒ Object + - .run_command_step(name, command, project_root:, env:, quiet:, command_runner:) ⇒ Object - - - - + +

    - +
    - +

    Raises:

    @@ -7199,32 +8489,32 @@

     
     
    -1382
    -1383
    -1384
    -1385
    -1386
    -1387
    -1388
    -1389
    -1390
    -1391
    -1392
    -1393
    -1394
    -1395
    -1396
    -1397
    -1398
    -1399
    -1400
    -1401
    -1402
    -1403
    -1404
    - -

    +
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1382
    +1592
    +1593
    +1594
    +1595
    +1596
    +1597
    +1598
    +1599
    +1600
    +1601
    +1602
    +1603
    +1604
    +1605
    +1606
    +1607
    +1608
    +1609
    +1610
    +1611
    +1612
    +1613
    +1614
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1592
     
     def run_command_step(name, command, project_root:, env:, quiet:, command_runner:)
       if command.first == File.join("bin", "setup") && !File.exist?(File.join(project_root, "bin", "setup"))
    @@ -7253,39 +8543,41 @@ 

    - +

    + + .run_system_command(command, chdir:, env:, quiet:) ⇒ Object + - .run_system_command(command, chdir:, env:, quiet:) ⇒ Object - - - - + +

     
     
    -1585
    -1586
    -1587
    -1588
    -1589
    -1590
    -1591
    -1592
    -1593
    -1594
    -1595
    +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1585
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1806
     
     def run_system_command(command, chdir:, env:, quiet:)
    -  stdout, stderr, status = Open3.capture3(env || {}, *command, chdir: chdir)
    +  command_env = quiet ? quiet_command_env(env) : (env || {})
    +  stdout, stderr, status = Open3.capture3(command_env, *quiet_command(command, quiet: quiet), chdir: chdir)
       $stdout.print(stdout) if !quiet && !stdout.empty?
       $stderr.print(stderr) if !quiet && !stderr.empty?
       {
    @@ -7299,34 +8591,91 @@ 

    - +
    -

    +

    + + .same_path?(left, right) ⇒ Boolean + + + + + +

    +
    + + + +
    +
    +
    + +

    Returns:

    +
      + +
    • + + + (Boolean) + + + +
    • + +
    - .semantic_git_driver_attribute_updatesObject +
    + + + + +
    +
     
     
    +741
    +742
    +743
    +744
    +745
    +
    +
    # File 'lib/kettle/jem/tasks/install_task.rb', line 741
     
    +def same_path?(left, right)
    +  File.realpath(left.to_s) == File.realpath(right.to_s)
    +rescue Errno::ENOENT
    +  File.expand_path(left.to_s) == File.expand_path(right.to_s)
    +end
    +
    +
    + +
    +

    + + .semantic_git_driver_attribute_updatesObject + + +

     
     
    -1076
    -1077
    -1078
    -1079
    -1080
    -1081
    -1082
    -1083
    -1084
    +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1076
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1267
     
     def semantic_git_driver_attribute_updates
       GIT_DRIVER_LANGUAGE_REGISTRY.values.map do |definition|
    @@ -7341,121 +8690,117 @@ 

    - +

    + + .setup_command_env(project_root, env) ⇒ Object + - .setup_command_env(project_root, env) ⇒ Object - - - - + +

     
     
    -862
    -863
    -864
    -865
    -866
    -867
    -868
    +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 862
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1019
     
     def setup_command_env(project_root, env)
       command_env = (env || {}).to_h.dup
    -  gemfile = File.join(project_root.to_s, "Gemfile")
    -  command_env["BUNDLE_GEMFILE"] = gemfile if File.file?(gemfile)
    +  requested_gemfile = command_env["BUNDLE_GEMFILE"].to_s
       strip_inherited_bundler_activation!(command_env)
    +  gemfile = File.join(project_root.to_s, "Gemfile")
    +  if File.file?(gemfile) || (!requested_gemfile.empty? && same_path?(requested_gemfile, gemfile))
    +    command_env["BUNDLE_GEMFILE"] = gemfile
    +  end
    +  command_env["K_JEM_TEMPLATING"] = "false"
    +  apply_kettle_family_local_install_env!(command_env)
       command_env
     end
    - +

    + + .strip_inherited_bundler_activation!(command_env) ⇒ Object + - .strip_inherited_bundler_activation!(command_env) ⇒ Object - - - - + +

    -
    -
    -870
    -871
    -872
    -873
    -874
    -875
    -876
    -877
    -878
    -879
    -880
    -881
    + + +1068 +1069 +1070 +1071 +1072
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 870
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1068
     
     def strip_inherited_bundler_activation!(command_env)
    -  %w[
    -    BUNDLE_BIN_PATH
    -    BUNDLE_LOCKFILE
    -    BUNDLER_SETUP
    -    BUNDLER_VERSION
    -    RUBYLIB
    -    RUBYOPT
    -  ].each do |key|
    -    command_env[key] = nil if command_env.key?(key)
    -  end
    +  (ENV.keys + command_env.keys).grep(/\ABUNDLE_/).each { |key| command_env[key] = nil }
    +  (ENV.keys + command_env.keys).grep(/\ABUNDLER_/).each { |key| command_env[key] = nil }
    +  %w[RUBYLIB RUBYOPT].each { |key| command_env[key] = nil }
     end
    - +

    + + .strip_leading_decorative_graphemes(text) ⇒ Object + - .strip_leading_decorative_graphemes(text) ⇒ Object - - - - + +

     
     
    -426
    -427
    -428
    -429
    -430
    -431
    -432
     433
     434
    -435
    +435 +436 +437 +438 +439 +440 +441 +442
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 426
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 433
     
     def strip_leading_decorative_graphemes(text)
       remaining = text.to_s.sub(/\A\s+/, "")
    @@ -7471,29 +8816,22 @@ 

    - +

    + + .sync_readme_gemspec_grapheme(project_root, env) ⇒ Object + - .sync_readme_gemspec_grapheme(project_root, env) ⇒ Object - - - - + +

     
     
    -326
    -327
    -328
    -329
    -330
    -331
    -332
     333
     334
     335
    @@ -7519,10 +8857,17 @@ 

    355 356 357 -358

    +358 +359 +360 +361 +362 +363 +364 +365
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 326
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 333
     
     def sync_readme_gemspec_grapheme(project_root, env)
       readme_path = File.join(project_root.to_s, "README.md")
    @@ -7561,29 +8906,22 @@ 

    - +

    + + .trim_readme_compatibility_badges(project_root, report) ⇒ Object + - .trim_readme_compatibility_badges(project_root, report) ⇒ Object - - - - + +

     
     
    -282
    -283
    -284
    -285
    -286
    -287
    -288
     289
     290
     291
    @@ -7610,10 +8948,17 @@ 

    312 313 314 -315

    +315 +316 +317 +318 +319 +320 +321 +322
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 282
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 289
     
     def trim_readme_compatibility_badges(project_root, report)
       readme_path = File.join(project_root.to_s, "README.md")
    @@ -7653,37 +8998,37 @@ 

    - +

    + + .unsafe_git_driver_command_value?(value) ⇒ Boolean + - .unsafe_git_driver_command_value?(value) ⇒ Boolean - - - - + +

    - +
    - +

    Returns:

      - +
    • - - + + (Boolean) - - - + + +
    • - +
    @@ -7692,12 +9037,12 @@

     
     
    -1200
    -1201
    -1202
    +1391 +1392 +1393

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1200
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1391
     
     def unsafe_git_driver_command_value?(value)
       value.include?("$(") || value.include?("${") || value.include?("`")
    @@ -7706,54 +9051,54 @@ 

    - +

    + + .validate_bundle_binstub_location(project_root) ⇒ Object + - .validate_bundle_binstub_location(project_root) ⇒ Object - - - - + +

     
     
    -662
    -663
    -664
    -665
    -666
    -667
    -668
    -669
    -670
    -671
    -672
    -673
    -674
    -675
    -676
    -677
    -678
    -679
    -680
    -681
    -682
    -683
    -684
    -685
    -686
    -687
    -688
    -689
    -690
    +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 662
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 806
     
     def validate_bundle_binstub_location(project_root)
       destination_bin = File.join(project_root.to_s, "bin")
    @@ -7788,37 +9133,37 @@ 

    - +

    + + .validate_git_driver_manifest!(manifest) ⇒ Object + - .validate_git_driver_manifest!(manifest) ⇒ Object - - - - + +

    - +
    - +

    Raises:

    @@ -7827,20 +9172,20 @@

     
     
    -1170
    -1171
    -1172
    -1173
    -1174
    -1175
    -1176
    -1177
    -1178
    -1179
    -1180
    +1361 +1362 +1363 +1364 +1365 +1366 +1367 +1368 +1369 +1370 +1371

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1170
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1361
     
     def validate_git_driver_manifest!(manifest)
       raise Kettle::Jem::Error, "Invalid .structuredmerge/git-drivers.toml: root must be a mapping" unless manifest.is_a?(Hash)
    @@ -7857,37 +9202,37 @@ 

    - +

    + + .validate_git_driver_profile!(profile_name, profile) ⇒ Object + - .validate_git_driver_profile!(profile_name, profile) ⇒ Object - - - - + +

    - +
    - +

    Raises:

    @@ -7896,26 +9241,26 @@

     
     
    -1182
    -1183
    -1184
    -1185
    -1186
    -1187
    -1188
    -1189
    -1190
    -1191
    -1192
    -1193
    -1194
    -1195
    -1196
    -1197
    -1198
    +1373 +1374 +1375 +1376 +1377 +1378 +1379 +1380 +1381 +1382 +1383 +1384 +1385 +1386 +1387 +1388 +1389

    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1182
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1373
     
     def validate_git_driver_profile!(profile_name, profile)
       raise Kettle::Jem::Error, "Invalid .structuredmerge/git-drivers.toml: profile name is required" if profile_name.to_s.empty?
    @@ -7938,28 +9283,28 @@ 

    - +

    + + .value_arg(flag, value) ⇒ Object + - .value_arg(flag, value) ⇒ Object - - - - + +

     
     
    -1367
    -1368
    -1369
    +1577 +1578 +1579
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1367
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 1577
     
     def value_arg(flag, value)
       value.to_s.strip.empty? ? [] : [flag, value.to_s]
    @@ -7968,29 +9313,29 @@ 

    - +

    + + .version_gem_bootstrap_step(project_root, report) ⇒ Object + - .version_gem_bootstrap_step(project_root, report) ⇒ Object - - - - + +

     
     
    -155
    -156
    -157
    -158
    +160 +161 +162 +163
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 155
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 160
     
     def version_gem_bootstrap_step(project_root, report)
       report.fetch(:post_apply_steps, []).find { |step| step.fetch(:name, nil) == "version_gem_bootstrap" } ||
    @@ -8000,44 +9345,44 @@ 

    - +

    + + .yard_binstub_rake_handoff_contentObject + - .yard_binstub_rake_handoff_contentObject - - - - + +

     
     
    -724
    -725
    -726
    -727
    -728
    -729
    -730
    -731
    -732
    -733
    -734
    -735
    -736
    -737
    -738
    -739
    -740
    -741
    -742
    +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886
    -
    # File 'lib/kettle/jem/tasks/install_task.rb', line 724
    +      
    # File 'lib/kettle/jem/tasks/install_task.rb', line 868
     
     def yard_binstub_rake_handoff_content
       <<~RUBY
    @@ -8062,15 +9407,15 @@ 

    - + diff --git a/gems/kettle-jem/docs/Kettle/Jem/Tasks/PrepareTask.html b/gems/kettle-jem/docs/Kettle/Jem/Tasks/PrepareTask.html index 6e0e34ccf..43ac51029 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/Tasks/PrepareTask.html +++ b/gems/kettle-jem/docs/Kettle/Jem/Tasks/PrepareTask.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::Tasks::PrepareTask - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -106,6 +106,16 @@

    "mise.toml" ].freeze +
    CRITICAL_TEMPLATING_GEMS = + +
    +
    %w[nomono].freeze
    + +
    LOCKED_TEMPLATING_GEMS = + +
    +
    %w[tree_sitter_language_pack].freeze
    + @@ -126,6 +136,52 @@

  • + .bundle_update_templating_bootstrap_command(project_root = Dir.pwd) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + + .locked_templating_gems(project_root) ⇒ Object + + + + + + + + + + + + + +
    +
    + +
  • + + +
  • + + .run(project_root: Dir.pwd, env: ENV, run_options: {}, command_runner: Kettle::Jem::Tasks::InstallTask.method(:run_system_command)) ⇒ Object @@ -157,7 +213,75 @@

    Class Method Details

    -

    +

    + + .bundle_update_templating_bootstrap_command(project_root = Dir.pwd) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +82
    +83
    +84
    +
    +
    # File 'lib/kettle/jem/tasks/prepare_task.rb', line 82
    +
    +def bundle_update_templating_bootstrap_command(project_root = Dir.pwd)
    +  %w[bundle update] + CRITICAL_TEMPLATING_GEMS + locked_templating_gems(project_root)
    +end
    +
    +
    + +
    +

    + + .locked_templating_gems(project_root) ⇒ Object + + + + + +

    + + + + +
    +
    +
    +
    +86
    +87
    +88
    +89
    +90
    +91
    +92
    +
    +
    # File 'lib/kettle/jem/tasks/prepare_task.rb', line 86
    +
    +def locked_templating_gems(project_root)
    +  lock_path = File.join(project_root.to_s, "Gemfile.lock")
    +  return [] unless File.file?(lock_path)
    +
    +  locked_names = Bundler::LockfileParser.new(Bundler.read_file(lock_path)).specs.map(&:name)
    +  LOCKED_TEMPLATING_GEMS & locked_names
    +end
    +
    +
    + +
    +

    .run(project_root: Dir.pwd, env: ENV, run_options: {}, command_runner: Kettle::Jem::Tasks::InstallTask.method(:run_system_command)) ⇒ Object @@ -171,10 +295,6 @@

     
     
    -17
    -18
    -19
    -20
     21
     22
     23
    @@ -199,10 +319,45 @@ 

    42 43 44 -45

    +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80

  • -
    # File 'lib/kettle/jem/tasks/prepare_task.rb', line 17
    +      
    # File 'lib/kettle/jem/tasks/prepare_task.rb', line 21
     
     def run(project_root: Dir.pwd, env: ENV, run_options: {}, command_runner: Kettle::Jem::Tasks::InstallTask.method(:run_system_command))
       effective_run_options = Kettle::Jem::Tasks::TemplateTask.env_run_options(env || {}).merge(run_options || {})
    @@ -212,6 +367,28 @@ 

    ) report = Kettle::Jem.apply_project(project_root, env: env, run_options: prepare_run_options) setup_env = Kettle::Jem::Tasks::InstallTask.setup_command_env(project_root, env) + events = Kettle::Jem.event_stream_from_options(effective_run_options) + Kettle::Jem.emit_step_event( + events, + "command_step", + {name: "bundle_update_templating_bootstrap", status: "started", command: bundle_update_templating_bootstrap_command(project_root)}, + phase: "prepare" + ) + update_step = Kettle::Jem::Tasks::InstallTask.run_command_step( + "bundle_update_templating_bootstrap", + bundle_update_templating_bootstrap_command(project_root), + project_root: project_root, + env: setup_env, + quiet: Kettle::Jem::DecisionPolicy.value_to_boolean(effective_run_options[:quiet]), + command_runner: command_runner + ) + Kettle::Jem.emit_step_event(events, "command_step", update_step, phase: "prepare") + Kettle::Jem.emit_step_event( + events, + "command_step", + {name: "bundle_install", status: "started", command: %w[bundle install]}, + phase: "prepare" + ) bundle_step = Kettle::Jem::Tasks::InstallTask.run_command_step( "bundle_install", %w[bundle install], @@ -220,18 +397,27 @@

    quiet: Kettle::Jem::DecisionPolicy.value_to_boolean(effective_run_options[:quiet]), command_runner: command_runner ) + Kettle::Jem.emit_step_event(events, "command_step", bundle_step, phase: "prepare") - report.merge( + final_report = report.merge( mode: "prepare", - prepared: bundle_step.fetch(:status) == "succeeded", + prepared: update_step.fetch(:status) == "succeeded" && + bundle_step.fetch(:status) == "succeeded", prepare_only: PREPARE_ONLY_PATHS, - prepare_steps: [bundle_step], - changed_files: (report.fetch(:changed_files, []) + bundle_step.fetch(:changed_files, [])).uniq.sort, + prepare_steps: [update_step, bundle_step], + changed_files: ( + report.fetch(:changed_files, []) + + update_step.fetch(:changed_files, []) + + bundle_step.fetch(:changed_files, []) + ).uniq.sort, diagnostics: report.fetch(:diagnostics, []) + [{ severity: "advisory", - message: "kettle:jem:prepare applied the templating dependency bootstrap payload and ran bundle install." + message: "kettle:jem:prepare applied the templating dependency bootstrap payload, " \ + "updated critical templating gems, and ran bundle install." }] ) + Kettle::Jem.emit_summary_event(events, final_report) + final_report end

    -
    # File 'lib/kettle/jem/tasks/template_task.rb', line 34
    +      
    # File 'lib/kettle/jem/tasks/template_task.rb', line 37
     
     def env_run_options(env)
       {
    @@ -330,12 +330,12 @@ 

     
     
    -60
    -61
    -62
    +63 +64 +65

    -
    # File 'lib/kettle/jem/tasks/template_task.rb', line 60
    +      
    # File 'lib/kettle/jem/tasks/template_task.rb', line 63
     
     def falsey?(value)
       Kettle::Jem::DecisionPolicy.falsey?(value)
    @@ -383,14 +383,14 @@ 

     
     
    -64
    -65
    -66
     67
    -68
    +68 +69 +70 +71

    -
    # File 'lib/kettle/jem/tasks/template_task.rb', line 64
    +      
    # File 'lib/kettle/jem/tasks/template_task.rb', line 67
     
     def monorepo_root_profile?(project_root, env, run_options)
       profile = (run_options || {})[:template_profile] || (run_options || {})["template_profile"] || (env || {})["KETTLE_JEM_TEMPLATE_PROFILE"]
    @@ -440,7 +440,10 @@ 

    29 30 31 -32

    +32 +33 +34 +35
    # File 'lib/kettle/jem/tasks/template_task.rb', line 9
    @@ -465,9 +468,12 @@ 

    project_root: project_root, env: setup_env, run_options: run_options, - command_runner: command_runner + command_runner: command_runner, + event_phase: "template" ) - report.merge(template_steps: template_steps) + final_report = report.merge(mode: "template", template_steps: template_steps) + Kettle::Jem.emit_summary_event(Kettle::Jem.event_stream_from_options(run_options), final_report) + final_report end

    -
    # File 'lib/kettle/jem/tasks/template_task.rb', line 56
    +      
    # File 'lib/kettle/jem/tasks/template_task.rb', line 59
     
     def truthy?(value)
       Kettle::Jem::DecisionPolicy.truthy?(value)
    @@ -532,9 +538,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/TemplateChecksums.html b/gems/kettle-jem/docs/Kettle/Jem/TemplateChecksums.html index 8a02d495b..c77f483fd 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/TemplateChecksums.html +++ b/gems/kettle-jem/docs/Kettle/Jem/TemplateChecksums.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::TemplateChecksums - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -359,19 +359,19 @@

     
     
    -1479
    -1480
    -1481
    -1482
    -1483
    -1484
    -1485
    -1486
    -1487
    -1488
    +1638 +1639 +1640 +1641 +1642 +1643 +1644 +1645 +1646 +1647

    -
    # File 'lib/kettle/jem.rb', line 1479
    +      
    # File 'lib/kettle/jem.rb', line 1638
     
     def build_yaml_block(checksums:, version: nil)
       lines = [YAML_KEY]
    @@ -403,20 +403,20 @@ 

     
     
    -1422
    -1423
    -1424
    -1425
    -1426
    -1427
    -1428
    -1429
    -1430
    -1431
    -1432
    +1581 +1582 +1583 +1584 +1585 +1586 +1587 +1588 +1589 +1590 +1591

    -
    # File 'lib/kettle/jem.rb', line 1422
    +      
    # File 'lib/kettle/jem.rb', line 1581
     
     def compute(template_root:)
       root = template_root.to_s.chomp("/")
    @@ -449,16 +449,16 @@ 

     
     
    -1471
    -1472
    -1473
    -1474
    -1475
    -1476
    -1477
    +1630 +1631 +1632 +1633 +1634 +1635 +1636

    -
    # File 'lib/kettle/jem.rb', line 1471
    +      
    # File 'lib/kettle/jem.rb', line 1630
     
     def detail_lines(diff)
       [
    @@ -487,19 +487,19 @@ 

     
     
    -1445
    -1446
    -1447
    -1448
    -1449
    -1450
    -1451
    -1452
    -1453
    -1454
    +1604 +1605 +1606 +1607 +1608 +1609 +1610 +1611 +1612 +1613

    -
    # File 'lib/kettle/jem.rb', line 1445
    +      
    # File 'lib/kettle/jem.rb', line 1604
     
     def diff(current:, stored:)
       current_keys = current.keys.to_set
    @@ -531,12 +531,12 @@ 

     
     
    -1456
    -1457
    -1458
    +1615 +1616 +1617

    -
    # File 'lib/kettle/jem.rb', line 1456
    +      
    # File 'lib/kettle/jem.rb', line 1615
     
     def diff_count(diff)
       diff.fetch(:added, []).size + diff.fetch(:changed, []).size + diff.fetch(:removed, []).size
    @@ -561,19 +561,19 @@ 

     
     
    -1434
    -1435
    -1436
    -1437
    -1438
    -1439
    -1440
    -1441
    -1442
    -1443
    +1593 +1594 +1595 +1596 +1597 +1598 +1599 +1600 +1601 +1602

    -
    # File 'lib/kettle/jem.rb', line 1434
    +      
    # File 'lib/kettle/jem.rb', line 1593
     
     def load_stored(config_path:)
       return {} unless File.exist?(config_path.to_s)
    @@ -605,29 +605,29 @@ 

     
     
    -1500
    -1501
    -1502
    -1503
    -1504
    -1505
    -1506
    -1507
    -1508
    -1509
    -1510
    -1511
    -1512
    -1513
    -1514
    -1515
    -1516
    -1517
    -1518
    -1519
    +1659 +1660 +1661 +1662 +1663 +1664 +1665 +1666 +1667 +1668 +1669 +1670 +1671 +1672 +1673 +1674 +1675 +1676 +1677 +1678

    -
    # File 'lib/kettle/jem.rb', line 1500
    +      
    # File 'lib/kettle/jem.rb', line 1659
     
     def replace_top_level_yaml_block(content, key, replacement)
       lines = content.to_s.lines
    @@ -669,19 +669,19 @@ 

     
     
    -1460
    -1461
    -1462
    -1463
    -1464
    -1465
    -1466
    -1467
    -1468
    -1469
    +1619 +1620 +1621 +1622 +1623 +1624 +1625 +1626 +1627 +1628

    -
    # File 'lib/kettle/jem.rb', line 1460
    +      
    # File 'lib/kettle/jem.rb', line 1619
     
     def summary(diff)
       count = diff_count(diff)
    @@ -713,18 +713,18 @@ 

     
     
    -1490
    -1491
    -1492
    -1493
    -1494
    -1495
    -1496
    -1497
    -1498
    +1649 +1650 +1651 +1652 +1653 +1654 +1655 +1656 +1657

    -
    # File 'lib/kettle/jem.rb', line 1490
    +      
    # File 'lib/kettle/jem.rb', line 1649
     
     def write_to_config(config_path:, checksums:, version: nil)
       return unless File.exist?(config_path.to_s)
    @@ -745,9 +745,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/TemplatingReport.html b/gems/kettle-jem/docs/Kettle/Jem/TemplatingReport.html index 5b5541008..6a4952f06 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/TemplatingReport.html +++ b/gems/kettle-jem/docs/Kettle/Jem/TemplatingReport.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::TemplatingReport - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -531,19 +531,19 @@

     
     
    -1548
    -1549
    -1550
    -1551
    -1552
    -1553
    -1554
    -1555
    -1556
    -1557
    +1707 +1708 +1709 +1710 +1711 +1712 +1713 +1714 +1715 +1716

    -
    # File 'lib/kettle/jem.rb', line 1548
    +      
    # File 'lib/kettle/jem.rb', line 1707
     
     def build_entry(name, spec, workspace_root:)
       path = spec&.full_gem_path.to_s
    @@ -575,14 +575,14 @@ 

     
     
    -1581
    -1582
    -1583
    -1584
    -1585
    +1740 +1741 +1742 +1743 +1744

    -
    # File 'lib/kettle/jem.rb', line 1581
    +      
    # File 'lib/kettle/jem.rb', line 1740
     
     def canonical_path(path)
       File.realpath(path)
    @@ -609,29 +609,29 @@ 

     
     
    -1587
    -1588
    -1589
    -1590
    -1591
    -1592
    -1593
    -1594
    -1595
    -1596
    -1597
    -1598
    -1599
    -1600
    -1601
    -1602
    -1603
    -1604
    -1605
    -1606
    +1746 +1747 +1748 +1749 +1750 +1751 +1752 +1753 +1754 +1755 +1756 +1757 +1758 +1759 +1760 +1761 +1762 +1763 +1764 +1765

    -
    # File 'lib/kettle/jem.rb', line 1587
    +      
    # File 'lib/kettle/jem.rb', line 1746
     
     def console_lines(snapshot: nil, project_root: nil)
       snapshot ||= self.snapshot
    @@ -673,25 +673,25 @@ 

     
     
    -1559
    -1560
    -1561
    -1562
    -1563
    -1564
    -1565
    -1566
    -1567
    -1568
    -1569
    -1570
    -1571
    +1718 +1719 +1720 +1721 +1722 +1723 +1724 +1725 +1726 +1727 +1728 +1729 +1730

    -
    # File 'lib/kettle/jem.rb', line 1559
    +      
    # File 'lib/kettle/jem.rb', line 1718
     
     def default_workspace_root
    -  env_root = ENV["KETTLE_RB_DEV"].to_s.strip
    +  env_root = ENV["KETTLE_DEV_DEV"].to_s.strip
       return if env_root.casecmp("false").zero?
     
       repo_root = File.expand_path("../../..", __dir__)
    @@ -746,16 +746,16 @@ 

     
     
    -1573
    -1574
    -1575
    -1576
    -1577
    -1578
    -1579
    +1732 +1733 +1734 +1735 +1736 +1737 +1738

    -
    # File 'lib/kettle/jem.rb', line 1573
    +      
    # File 'lib/kettle/jem.rb', line 1732
     
     def local_path?(path, workspace_root: default_workspace_root)
       return false if workspace_root.to_s.strip.empty?
    @@ -784,18 +784,18 @@ 

     
     
    -1717
    -1718
    -1719
    -1720
    -1721
    -1722
    -1723
    -1724
    -1725
    +1876 +1877 +1878 +1879 +1880 +1881 +1882 +1883 +1884

    -
    # File 'lib/kettle/jem.rb', line 1717
    +      
    # File 'lib/kettle/jem.rb', line 1876
     
     def local_warning_section(warning)
       <<~MARKDOWN.chomp
    @@ -803,7 +803,7 @@ 

    #{warning} - Set `KETTLE_RB_DEV=true` (or configure it in `.env.local`) to use sibling workspace gems instead of the installed release. + Set `KETTLE_DEV_DEV=true` (or configure it in `.env.local`) to use sibling workspace gems instead of the installed release. MARKDOWN end

    -
    # File 'lib/kettle/jem.rb', line 1727
    +      
    # File 'lib/kettle/jem.rb', line 1886
     
     def local_workspace_warning(snapshot:, project_root:)
       return if project_root.to_s.strip.empty?
    @@ -868,9 +868,9 @@ 

    checkout_path = canonical_path(local_checkout) return if loaded_path == checkout_path - env_value = ENV.fetch("KETTLE_RB_DEV", "<unset>") + env_value = ENV.fetch("KETTLE_DEV_DEV", "<unset>") "Detected sibling workspace checkout at `#{Kettle::Jem.display_path(local_checkout)}`, but this run is using installed `kettle-jem` " \ - "(KETTLE_RB_DEV=#{env_value.inspect})." + "(KETTLE_DEV_DEV=#{env_value.inspect})." end

    -
    # File 'lib/kettle/jem.rb', line 1707
    +      
    # File 'lib/kettle/jem.rb', line 1866
     
     def local_workspace_warning_lines(snapshot:, project_root:)
       warning = local_workspace_warning(snapshot: snapshot, project_root: project_root)
    @@ -911,7 +911,7 @@ 

    [ "WARNING: #{warning}", - "Hint: set KETTLE_RB_DEV=true (or configure it in .env.local) to use sibling workspace gems." + "Hint: set KETTLE_DEV_DEV=true (or configure it in .env.local) to use sibling workspace gems." ] end

    -
    # File 'lib/kettle/jem.rb', line 1608
    +      
    # File 'lib/kettle/jem.rb', line 1767
     
     def markdown_section(snapshot: nil)
       snapshot ||= self.snapshot
    @@ -1000,49 +1000,49 @@ 

     
     
    -1630
    -1631
    -1632
    -1633
    -1634
    -1635
    -1636
    -1637
    -1638
    -1639
    -1640
    -1641
    -1642
    -1643
    -1644
    -1645
    -1646
    -1647
    -1648
    -1649
    -1650
    -1651
    -1652
    -1653
    -1654
    -1655
    -1656
    -1657
    -1658
    -1659
    -1660
    -1661
    -1662
    -1663
    -1664
    -1665
    -1666
    -1667
    -1668
    -1669
    +1789 +1790 +1791 +1792 +1793 +1794 +1795 +1796 +1797 +1798 +1799 +1800 +1801 +1802 +1803 +1804 +1805 +1806 +1807 +1808 +1809 +1810 +1811 +1812 +1813 +1814 +1815 +1816 +1817 +1818 +1819 +1820 +1821 +1822 +1823 +1824 +1825 +1826 +1827 +1828

    -
    # File 'lib/kettle/jem.rb', line 1630
    +      
    # File 'lib/kettle/jem.rb', line 1789
     
     def render_markdown(project_root:, output_dir: nil, snapshot: nil, run_started_at: Time.now, finished_at: nil,
       status: nil, warnings: [], error: nil, template_diff: nil, template_commit_sha: nil)
    @@ -1104,14 +1104,14 @@ 

     
     
    -1671
    -1672
    -1673
    -1674
    -1675
    +1830 +1831 +1832 +1833 +1834

    -
    # File 'lib/kettle/jem.rb', line 1671
    +      
    # File 'lib/kettle/jem.rb', line 1830
     
     def report_path(project_root:, output_dir: nil, run_started_at: Time.now, pid: Process.pid)
       target_root = output_dir || project_root
    @@ -1138,15 +1138,15 @@ 

     
     
    -1749
    -1750
    -1751
    -1752
    -1753
    -1754
    +1908 +1909 +1910 +1911 +1912 +1913

    -
    # File 'lib/kettle/jem.rb', line 1749
    +      
    # File 'lib/kettle/jem.rb', line 1908
     
     def sibling_workspace_root(project_root)
       candidate = canonical_path(File.expand_path("..", project_root))
    @@ -1174,16 +1174,16 @@ 

     
     
    -1540
    -1541
    -1542
    -1543
    -1544
    -1545
    -1546
    +1699 +1700 +1701 +1702 +1703 +1704 +1705

    -
    # File 'lib/kettle/jem.rb', line 1540
    +      
    # File 'lib/kettle/jem.rb', line 1699
     
     def snapshot(loaded_specs: Gem.loaded_specs, workspace_root: default_workspace_root)
       {
    @@ -1212,15 +1212,15 @@ 

     
     
    -1700
    -1701
    -1702
    -1703
    -1704
    -1705
    +1859 +1860 +1861 +1862 +1863 +1864

    -
    # File 'lib/kettle/jem.rb', line 1700
    +      
    # File 'lib/kettle/jem.rb', line 1859
     
     def source_label(entry)
       return "not loaded" unless entry[:loaded]
    @@ -1248,28 +1248,28 @@ 

     
     
    -1756
    -1757
    -1758
    -1759
    -1760
    -1761
    -1762
    -1763
    -1764
    -1765
    -1766
    -1767
    -1768
    -1769
    -1770
    -1771
    -1772
    -1773
    -1774
    +1915 +1916 +1917 +1918 +1919 +1920 +1921 +1922 +1923 +1924 +1925 +1926 +1927 +1928 +1929 +1930 +1931 +1932 +1933

    -
    # File 'lib/kettle/jem.rb', line 1756
    +      
    # File 'lib/kettle/jem.rb', line 1915
     
     def template_diff_section(diff)
       lines = ["## Template File Changes", ""]
    @@ -1310,31 +1310,31 @@ 

     
     
    -1677
    -1678
    -1679
    -1680
    -1681
    -1682
    -1683
    -1684
    -1685
    -1686
    -1687
    -1688
    -1689
    -1690
    -1691
    -1692
    -1693
    -1694
    -1695
    -1696
    -1697
    -1698
    +1836 +1837 +1838 +1839 +1840 +1841 +1842 +1843 +1844 +1845 +1846 +1847 +1848 +1849 +1850 +1851 +1852 +1853 +1854 +1855 +1856 +1857

    -
    # File 'lib/kettle/jem.rb', line 1677
    +      
    # File 'lib/kettle/jem.rb', line 1836
     
     def write(project_root:, output_dir: nil, snapshot: nil, report_path: nil, run_started_at: Time.now,
       finished_at: nil, status: nil, warnings: [], error: nil, template_diff: nil, template_commit_sha: nil)
    @@ -1368,9 +1368,9 @@ 

    diff --git a/gems/kettle-jem/docs/Kettle/Jem/Version.html b/gems/kettle-jem/docs/Kettle/Jem/Version.html index 40a5ca58a..0a97635a4 100644 --- a/gems/kettle-jem/docs/Kettle/Jem/Version.html +++ b/gems/kettle-jem/docs/Kettle/Jem/Version.html @@ -6,7 +6,7 @@ Module: Kettle::Jem::Version - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -98,7 +98,7 @@

    VERSION =
    -
    "7.0.0"
    +
    "7.1.0"
    @@ -114,9 +114,9 @@

    diff --git a/gems/kettle-jem/docs/_index.html b/gems/kettle-jem/docs/_index.html index 4120d0ae0..0f22ab506 100644 --- a/gems/kettle-jem/docs/_index.html +++ b/gems/kettle-jem/docs/_index.html @@ -4,7 +4,7 @@ - Documentation by YARD 0.9.44 + Documentation by YARD 0.9.45 @@ -54,7 +54,7 @@
    -

    Documentation by YARD 0.9.44

    +

    Documentation by YARD 0.9.45

    Alphabetic Index

    @@ -162,6 +162,13 @@

    Namespace Listing A-Z

    +
  • + EventStream + + (Kettle::Jem) + +
  • + @@ -318,13 +325,6 @@

    Namespace Listing A-Z

  • R
  • diff --git a/gems/kettle-jem/docs/class_list.html b/gems/kettle-jem/docs/class_list.html index 53ef1f5f4..49a73561d 100644 --- a/gems/kettle-jem/docs/class_list.html +++ b/gems/kettle-jem/docs/class_list.html @@ -46,7 +46,7 @@

    Class List

    diff --git a/gems/kettle-jem/docs/file.AGENTS.html b/gems/kettle-jem/docs/file.AGENTS.html index 84581aff2..0ae40a514 100644 --- a/gems/kettle-jem/docs/file.AGENTS.html +++ b/gems/kettle-jem/docs/file.AGENTS.html @@ -6,7 +6,7 @@ File: AGENTS - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -244,7 +244,7 @@

    🔧 Development Workflows

    Running Commands

    -

    Always make commands self-contained. Use mise exec -C /home/pboling/src/kettle-rb/prism-merge -- ... so the command gets the project environment in the same invocation.
    +

    Always make commands self-contained. Use mise exec -C /home/pboling/src/my/prism-merge -- ... so the command gets the project environment in the same invocation.
    If the command is complicated write a script in local tmp/ and then run the script.

    Running Tests

    @@ -270,16 +270,16 @@

    Template Management (kettle-jem)

    and regenerate local finishing artifacts such as binstubs:

    # Standard run (quiet, non-interactive — the default)
    -mise exec -C /path/to/project -- env K_JEM_TEMPLATING=true bundle exec kettle-jem install
    +mise exec -C /path/to/project -- env K_JEM_TEMPLATING=true kettle-jem install
     
     # Verbose output (see per-file detail)
    -mise exec -C /path/to/project -- env K_JEM_TEMPLATING=true KETTLE_JEM_VERBOSE=true bundle exec kettle-jem install
    +mise exec -C /path/to/project -- env K_JEM_TEMPLATING=true KETTLE_JEM_VERBOSE=true kettle-jem install
     
     # Interactive mode (prompt before each change)
    -mise exec -C /path/to/project -- env K_JEM_TEMPLATING=true bundle exec kettle-jem install --interactive
    +mise exec -C /path/to/project -- env K_JEM_TEMPLATING=true kettle-jem install --interactive
     
     # Scoped file update only; skips install finishing steps
    -mise exec -C /path/to/project -- env K_JEM_TEMPLATING=true bundle exec kettle-jem template --only README.md
    +mise exec -C /path/to/project -- env K_JEM_TEMPLATING=true kettle-jem template --only README.md
     

    Use the kettle-jem executable as the public entrypoint. The
    @@ -410,9 +410,9 @@

    🚫 Common Pitfalls

    diff --git a/gems/kettle-jem/docs/file.AGPL-3.0-only.html b/gems/kettle-jem/docs/file.AGPL-3.0-only.html index 0f1f53d64..8f20e7144 100644 --- a/gems/kettle-jem/docs/file.AGPL-3.0-only.html +++ b/gems/kettle-jem/docs/file.AGPL-3.0-only.html @@ -6,7 +6,7 @@ File: AGPL-3.0-only - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -342,9 +342,9 @@ diff --git a/gems/kettle-jem/docs/file.CHANGELOG.html b/gems/kettle-jem/docs/file.CHANGELOG.html index 029c954cf..554926d49 100644 --- a/gems/kettle-jem/docs/file.CHANGELOG.html +++ b/gems/kettle-jem/docs/file.CHANGELOG.html @@ -5,9 +5,9 @@ File: CHANGELOG - - — Documentation by YARD 0.9.44 - + + — Documentation by YARD 0.9.45 + @@ -37,14 +37,14 @@
    @@ -72,12 +72,58 @@

    Unreleased

    +

    Fixed

    + +
      +
    • +kettle-jem’s default development bundle now pins
      +tree_sitter_language_pack to the StructuredMerge fork branch that exposes
      +the Ruby parser API, while still allowing templating runs to override it with
      +VENDORED_GEMS.
    • +
    • Gemspec templating now deletes empty generated development-dependency comment
      +sections through Prism-backed CRISPR structural edits, preventing blank-line
      +churn before the closing Gem::Specification end.
    • +
    • Fixed the kettle-jem package manifest so runtime template assets are
      +included even when the gemspec is loaded from the monorepo root.
    • +
    • Generated local templating Gemfiles can now route
      +tree_sitter_language_pack through nomono’s VENDORED_GEMS /
      +VENDOR_GEM_DIR support instead of using a one-off inferred local path.
    • +
    +

    Added

      +
    • +kettle-jem now supports --events for newline-delimited JSON progress
      +events, including named event type filters via comma-separated
      +--events=TYPE,... values, phase events, per-recipe template progress,
      +post-apply and command-step events, diagnostics, and summary events for family
      +orchestration consumers.
    • +
    • Generated CI workflow templates now cache .rspec_status with explicit
      +per-workflow keys so kettle-test / turbo_tests2 can reuse timing data
      +across MRI, JRuby, TruffleRuby, coverage, heads, dep-heads, and framework
      +matrix runs.
    • +
    • Generated dep-heads workflows now document why TruffleRuby runs directly from
      +gemfiles/dep_heads.gemfile, making that generated Appraisal file required
      +checked-in output for the workflow.
    • +
    • JRuby 9.2 workflow templates now use the legacy-engine bundle install path
      +instead of ruby/setup-ruby bundler caching so old Bundler does not fail
      +setup against gem servers without the full legacy index.
    • +
    • Gemspec templating now structurally merges destination spec.files
      +collection entries with template package entries so project-specific
      +packaged files are not lost when the template rewrites the generated gemspec
      +structure.
    • +
    • Gemspec templating now restores additional legacy Prism policy behavior for
      +destination-only metadata fields, Bundler git ls-files package declarations,
      +and empty development-dependency section cleanup after runtime dependency
      +promotion.
    • Added the repo-local bin/kettle-jem-workflow-pins maintenance script to
      update the GitHub Actions SHA pin index used by generated workflow templates
      via kettle-gha-sha-pins.
    • +
    • Generated local Gemfile templates now document why nomono is explicitly
      +activated before requiring nomono/bundler.
    • +
    • Added the repo-local bin/kettle-jem-deps-floor maintenance script to scan
      +dependency-bearing kettle-jem templates and update their dependency floors.
    • kettle-jem install now generates a curated bin/appraisal binstub for the
      appraisal2 executable.
    • @@ -85,25 +131,324 @@

      Added

      README badges.
    • Added explicit ruby.test_minimum template configuration, defaulting to
      Ruby 2.4, for generated CI workflow and Appraisal floors.
    • +
    • Added top-level integrations configuration for disabling coverage
      +integrations (codecov, coveralls, qlty) and the SkyWalking Eyes license
      +check integration across README badges, upload/check workflow steps, packaged
      +config/workflow templates, and cleanup of existing config files or workflows.
    • kettle-jem’s own mise environment now enables templating dependencies so
      templating-only floors are validated in the normal gem bundle.
    • Restored kettle-jem prepare as a pre-flight dependency bootstrap mode for
      applying the minimal templating Gemfile payload before full templating.
    • +
    • Gem templates and generated root Gemfiles now require kettle-dev >= 2.2.24.
    • Version-gem bootstrapping now removes stale top-level RBS VERSION
      declarations and generated style workflows load the RBS environment so
      duplicate declarations fail in CI.
    • +
    • Version-gem bootstrapping now removes literal bundle gem scaffold RBS
      +VERSION declarations before writing the managed version.rbs signature.
    • +
    • Added a destructive shim template profile for compatibility wrapper gems.
      +Shim templating accepts the replacement gem via --shimmed-gem or
      +KETTLE_JEM_SHIMMED_GEM, generates only the shim runtime/docs/specs/CI, and
      +deletes obsolete implementation code, behavior specs, workflows, and gemfiles.

    Changed

      +
    • Generated gemspec templates now require kettle-dev >= 2.3.7.
    • +
    • kettle-jem now requires kettle-rb >= 0.1.4.
    • +
    • Refreshed generated GitHub Actions workflow pins for ruby/setup-ruby and
      +CodeQL actions.
    • +
    • Gemfile and Appraisals template merge adapter failures now fail closed instead
      +of silently accepting template content.
    • +
    • Generated pull request engine workflows now keep JRuby and TruffleRuby
      +coverage available via branch opt-in prefixes: jruby/* runs JRuby
      +workflows, truffleruby/* runs TruffleRuby workflows, and engines/* runs
      +all engine workflows. Other pull request branches continue to run MRI checks
      +without the alternate engine jobs.
    • +
    • Generated CONTRIBUTING docs now explain the jruby/*, truffleruby/*, and
      +engines/* branch prefixes that opt pull requests into alternate Ruby engine
      +workflows.
    • +
    • Generated workflow templates now evaluate skip-CI commit messages only for
      +push events, and mixed head/dependency-head templates gate JRuby and
      +TruffleRuby jobs before runner provisioning on pull requests.
    • +
    • Generated standalone JRuby and TruffleRuby workflow templates now group their
      +push skip checks before their pull request branch guards so ordinary pull
      +request branches do not run alternate engine jobs.
    • +
    • Template apply now restores executable bits on generated Git hook scripts.
    • +
    • +require "kettle/jem" now defers parser-backed template runtime dependencies
      +until template execution so Rake task installation does not load
      +tree_sitter_language_pack before RuboCop loads parser.
    • +
    • +require "kettle/jem" no longer directly loads version_gem by default;
      +require kettle/jem/version_gem for the optional VersionGem::Basic
      +extension.
    • +
    • Ruby, engine, Rails, RuboCop, and RuboCop LTS compatibility choices now come
      +from Kettle::Rb::CompatMatrix in kettle-rb.
    • +
    • Generated mise.toml files no longer export RUBOCOP_LTS_LOCAL=false;
      +local RuboCop-LTS mode is now controlled by setting the variable only when a
      +local checkout should be used.
    • +
    • Generated style Gemfiles now require rubocop-lts-rspec >= 1.0.4.
    • +
    • kettle-jem now declares and loads the direct rbs runtime dependency used
      +by its RBS signature cleanup logic.
    • +
    • Version-gem bootstrapping now preserves projects that load version_gem
      +through a dedicated lib/<entrypoint>/version_gem.rb file instead of forcing
      +it back into the default entrypoint.
    • +
    • Version-gem bootstrapping now updates existing generated version specs to
      +require a dedicated lib/<entrypoint>/version_gem.rb entrypoint when present.
    • +
    • Gem templates and generated root Gemfiles now require kettle-dev >= 2.3.5.
    • +
    • Gem templates and generated root Gemfiles now require kettle-test >= 2.0.11.
    • +
    • Gem templates and generated root Gemfiles now require turbo_tests2 >= 3.1.14.
    • +
    • Generated gemspecs and optional Gemfiles now require stone_checksums >= 1.0.6.
    • +
    • Shim gemspec templates now include LICENSE.md, matching the generated
      +license template filename, instead of the nonexistent LICENSE.txt.
    • +
    • Monorepo subgem package templating now includes the main Gemfile so existing
      +generated gems receive the nomono bootstrap required by local modular
      +Gemfiles during templating-mode CI.
    • +
    • Templating now applies transferable kettle-jem changelog entries to destination
      +CHANGELOG.md files using stable kettle-jem-template-YYYYMMDD-NNN IDs.
    • +
    • Generated gemspecs now support explicit extra package-file globs via
      +gemspec.package_files.include in .structuredmerge/kettle-jem.yml.
    • +
    • Version-gem templates now generate one package-level RBS file at
      +sig/<entrypoint>.rbs and migrate legacy nested
      +sig/<entrypoint>/version.rbs files into it.
    • +
    • Generated gemspec package manifests now omit repository-only governance docs,
      +signing certs, recursive signature directories, split license files, and
      +spec.extra_rdoc_files by default.
    • +
    • Generated templates now require the released floors for kettle-dev 2.3.0,
      +kettle-drift 1.0.5, kettle-test 2.0.9, nomono 1.0.8, and
      +token-resolver 2.0.4.
    • +
    • Generated gemspecs now require appraisal2 >= 3.1.4.
    • +
    • +

      Generated style Gemfiles now require appraisal2-rubocop >= 1.0.0.

      +
    • +
    • +

      Generated optional Gemfiles no longer duplicate the gemspec’s direct
      +stone_checksums development dependency.

      +
    • +
    • Quiet templating orchestration now passes quiet flags and debug-suppressing
      +environment to Bundler commands.
    • +
    • Generated Appraisal guidance now defaults to bin/rake appraisal:generate,
      +reserving appraisal:update for intentional lock refreshes.
    • +
    • Gemspec templating now raises preserved rspec-stubbed_env dependencies to
      +>= 1.0.6.
    • +
    • Generated documentation Gemfiles now require yard-fence >= 0.9.6,
      +yard-timekeeper >= 0.2.3, and yard-yaml >= 0.2.3.
    • +
    • +

      kettle-jem now requires kettle-rb >= 0.1.2.

      +
    • +
    • kettle-jem-template-20260716-001 - Shim gemspec manifests now include
      +LICENSE.md instead of nonexistent LICENSE.txt.
    • +
    • kettle-jem-template-20260716-002 - Generated gemspec manifests now ship fewer
      +repository-only files by default to reduce downstream distro packaging churn.
    • +
    + +

    Deprecated

    + +

    Removed

    + +

    Fixed

    + +
      +
    • Templating setup now respects explicit STRUCTUREDMERGE_DEV=false and
      +KETTLE_DEV_DEV=false values when reading the kettle-family local install
      +marker, preventing prepare-mode bundle updates from re-enabling stale local
      +Gemfile wiring.
    • +
    • Generated root Gemfiles no longer add a separate gem "nomono" bootstrap
      +line when templating the nomono gem itself, avoiding duplicate dependency
      +declarations against the package gemspec.
    • +
    • +kettle-jem prepare no longer explicitly asks Bundler to update parser gems
      +before they exist in a member lockfile, allowing cold-start templating
      +bootstraps to introduce vendored parser path dependencies during
      +bundle install.
    • +
    • Workflow template pin maintenance now compares and updates complete pinned
      +action strings in source files, so bin/kettle-jem-workflow-pins --check
      +fails when template files drift from github_actions_step_pins even if the
      +action name is already covered by the pin index.
    • +
    • kettle-jem’s own gemspec now includes public signing certs in packaged files.
    • +
    • Generated CI workflow synchronization now emits valid YAML for matrix and
      +setup-ruby sections instead of misindenting multi-line template fragments.
    • +
    • Open Collective badge/funding detection now respects disabled funding policy
      +without falling back to the default organization.
    • +
    • Version-gem RBS consolidation now migrates all legacy nested
      +sig/<entrypoint>/**/*.rbs content into the package-level signature and
      +removes the nested files, including when the package-level signature is
      +managed by a template entry.
    • +
    • Generated dep-heads workflows now run current TruffleRuby directly from the
      +generated gemfiles/dep_heads.gemfile, avoiding Appraisal.root.gemfile
      +bootstrap failures with TruffleRuby’s bundled RubyGems/Bundler and gem.coop.
    • +
    • Packaged Rakefile templating now merges destination Rakefiles by default
      +instead of replacing them wholesale, preserving project-specific rake tasks
      +such as release or adapter test helpers.
    • +
    • Version-gem namespace discovery no longer treats nested implementation
      +namespaces in the public entrypoint, such as Kettle::Dev::Tasks, as the gem
      +namespace when the existing version namespace is more specific.
    • +
    • Gemfile and gemspec templating byte-offset rewrites now splice source with
      +byte-aware slicing so non-ASCII content before an edited AST node does not
      +corrupt generated Ruby.
    • +
    • Generated legacy-engine CI workflows now install Bundler gems under
      +${RUNNER_TEMP}/bundle instead of vendor/bundle, preventing Appraisal
      +installs from creating nested gemfiles/vendor bundles.
    • +
    • +

      Generated RuboCop configs now exclude **/vendor/**/* so nested vendored
      +dependency trees are not linted.

      +
    • +
    • Fixed bin/kettle-jem-workflow-pins so its default project root resolves to
      +the kettle-jem gem root relative to the script instead of the caller’s working
      +directory.
    • +
    • Generated GitHub Actions workflows now preserve existing push branch filters
      +from destination workflows.
    • +
    • GitHub Actions workflow templating now preserves existing destination SHA
      +pins for the same action/version when accepted templates are stale, and emits
      +a final warning telling maintainers to update the workflow template pins.
    • +
    • SimpleCov templating now removes legacy kettle-soup-cover startup requires
      +from .simplecov and upgrades modifier-form spec_helper coverage bootstraps
      +to the full kettle-soup-cover SimpleCov.start block.
    • +
    • Root Gemfile templating now keeps nomono_requirements before existing
      +gem "nomono", *nomono_requirements calls when merging legacy local sibling
      +wiring.
    • +
    • Root Gemfile templating no longer adds generic direct-sibling path wiring for
      +runtime dependencies already handled by project-specific local modular
      +Gemfiles.
    • +
    • Root Gemfile templating now evaluates the paired modular Gemfile for direct
      +runtime dependencies handled by *_local.gemfile overrides, preserving
      +released-vs-local switching after accept_template Gemfile rewrites.
    • +
    • Root Gemfile templating now recognizes eval_nomono_gems(gems: local_gems)
      +declarations in *_local.gemfile files before deciding whether a runtime
      +dependency is already handled by paired modular local wiring.
    • +
    • Local GitHub remotes now override generated gemspec source_code_uri tag URLs
      +when deriving repository owner tokens, preventing stale homepage metadata from
      +corrupting README logos and local sibling workspace env names.
    • +
    • Bootstrap configs now seed runtime URI values, OpenCollective ENV overrides,
      +and Gemfile template ownership so first-time full templating does not leave
      +raw URI tokens or merge legacy Gemfile dependency sets into the generated
      +bundle.
    • +
    • Generated Gemfiles now activate the Bundler-locked nomono before loading
      +nomono/bundler, avoiding global gem activation conflicts during
      +templating.
    • +
    • Generated Gemfiles now scope templating-only direct sibling local-path
      +environment overrides to the direct dependency block so later modular
      +Gemfiles do not accidentally enter local sibling mode.
    • +
    • Generated style Gemfiles now skip released RuboCop-LTS gems that were already
      +declared by earlier Gemfile evaluation, avoiding duplicate path/version
      +declarations during templating.
    • +
    • Generated documentation local Gemfiles now skip the current package and
      +already declared gems before adding local family path overrides.
    • +
    • Gem templates now require appraisal2 >= 3.1.3.
    • +
    • Generated style Gemfiles now require appraisal2-rubocop >= 0.2.2.
    • +
    • Generated main Gemfiles now require nomono >= 1.0.6.
    • +
    • Generated templating local Gemfiles now only use TSLP_DEV for local
      +tree_sitter_language_pack path overrides and no longer derive that path
      +from STRUCTUREDMERGE_DEV.
    • +
    • Generated gemspecs now require version_gem >= 1.1.14.
    • +
    • Generated gemspecs now require gitmoji-regex >= 2.0.4.
    • +
    • Generated documentation Gemfiles now require yaml-converter >= 0.2.3.
    • +
    • Generated documentation Gemfiles now require yard-fence >= 0.9.5.
    • +
    • Generated documentation Gemfiles now require yard-timekeeper >= 0.2.2.
    • +
    • Generated documentation Gemfiles now require yard-yaml >= 0.2.2.
    • +
    • Gemfile, gemspec, Appraisal, and Rakefile template merging now derives Ruby
      +call source ranges and static string values from Prism nodes so heredoc
      +string arguments are preserved transparently.
    • +
    • Gemspec dependency preservation now rewrites project-version constant
      +interpolation in dependency requirements to spec.version so preserved
      +dependencies remain loadable after anonymous-module version loading.
    • +
    • Removed retired funding links and template tokens from generated kettle-jem
      +funding and README templates.
    • +
    • Retemplated generated project metadata, support documentation, CI workflows,
      +binstubs, and development dependency floors with kettle-jem v7.0.0.
    • +
    • Generated README and workflow templates now treat Ruby 4.0 as MRI current,
      +add discrete JRuby 10.0 and TruffleRuby 33.0 workflows/badges, and include a
      +TruffleRuby HEAD badge pointing at the shared heads workflow.
    • +
    • Generated CI workflows now disable ruby/setup-ruby Bundler caching for
      +TruffleRuby 25.0 and JRuby 9.3 and run a serial Bundler install to avoid
      +legacy engine setup failures.
    • +
    • +kettle-jem install now runs rubocop_gradual:autocorrect after templating
      +and before the bootstrap commit when the destination project provides
      +bin/rake, so project-local Ruby syntax floors can normalize generated
      +files.
    • +
    • +RUBOCOP_LTS_LOCAL templating now switches the local rubocop-lts/rubocop-lts
      +checkout to the branch matching the selected rubocop-rubyN_N wrapper before
      +running setup and RuboCop Gradual normalization.
    • +
    • Generated RuboCop-LTS local style Gemfiles now exclude the current project
      +package and already-declared gems before adding local family path overrides.
    • +
    • Generated funding templates now default missing OpenCollective orgs to
      +galtzo-floss and warn when that fallback differs from the GitHub org.
    • +
    • Shim gemspec templates now include the kettle-dev release/test harness
      +dependencies required by kettle-changelog, kettle-test, and release tasks.
    • +
    • Shim gemspec templates now resolve the generated gem version token instead of
      +leaving {KJ|GEM_VERSION} unresolved.
    • +
    • Shim and monorepo-root template profiles now include generated .gitignore
      +files so local .env.local configuration is ignored consistently.
    • +
    • Shim Gemfile templates now include nomono and the generated templating
      +Gemfiles so K_JEM_TEMPLATING=true bundle exec kettle-jem install works.
    • +
    • Shim Gemfile templates no longer add a Git-sourced replacement gem fallback;
      +the released replacement gem is already declared by the generated gemspec.
    • +
    • Shim Gemfile templates now use https://gem.coop, matching the full template
      +and allowing released replacement gems to resolve without Git sources.
    • +
    • Generated README compatibility sections now use prose for the test-matrix
      +credit and render all generated details blocks with Markdown enabled.
    • +
    • Generated README compatibility sections now pair the test-matrix credit with
      +the kettle-dev logo and use a kettle-dev-specific details summary.
    • +
    • The generated README dev/test stack table now includes kettle-jem with its
      +Appraisals and CI workflow template role.
    • +
    • The generated README dev/test stack table now includes kettle-dev and keeps
      +stack gems in A-Z order while preserving self-exclusion.
    • +
    • Gem templates and generated root Gemfiles now require kettle-dev >= 2.2.22.
    • +
    • Generated SimpleCov setup now keeps .simplecov configuration-only and
      +starts coverage explicitly from spec/spec_helper.rb for SimpleCov v1.
    • +
    • +.simplecov templating now removes obsolete SimpleCov.start blocks with a
      +Prism AST cleanup pass while preserving destination-local configuration.
    • +
    • +.simplecov templating now removes the obsolete kettle-soup-cover config
      +require with the same Prism AST cleanup pass so SimpleCov finishes loading
      +before formatter configuration is required.
    • +
    • +.simplecov templating now migrates old generated keep_destination
      +overrides and converts preserved track_files calls to cover calls.
    • +
    • Generated spec helper templating now normalizes stale SimpleCov bootstrap
      +blocks by deduplicating SimpleCov requires and restoring the formatter config
      +require before SimpleCov.start.
    • +
    • Generated spec helpers now document that requiring SimpleCov loads the
      +configuration-only .simplecov before coverage starts.
    • +
    • Generated coverage Gemfiles no longer pin SimpleCov to the pre-release-only
      +kettle-dev/simplecov fix-final-parallel-worker-formatting branch.
    • +
    • Generated workspace path examples now use the renamed my local workspace
      +instead of the old kettle-rb checkout path.
    • +
    • Generated coverage Gemfiles now require kettle-soup-cover >= 3.0.0.
    • +
    • Generated Rakefiles now use # simplecov:disable / # simplecov:enable
      +blocks instead of deprecated legacy coverage markers.
    • +
    • +kettle-jem install now uses the latest kettle-family install marker to
      +activate locally installed template-stack source roots during templating
      +setup.
    • +
    • Generated Gemfiles now guard preserved runtime eval_nomono_gems workspace
      +overrides during K_JEM_TEMPLATING=true, keeping templating bundles isolated
      +from target runtime sibling path dependencies.
    • +
    • Generated main Gemfiles now add templating-aware nomono wiring for direct
      +runtime dependencies that exist as sibling gems in the same local family
      +workspace.
    • +
    • Install lockfile normalization now keeps direct sibling runtime dependencies
      +available through the generated family *_DEV environment while still
      +disabling templating-only path overrides.
    • +
    • Generated kettle-jem usage instructions now use the kettle-jem executable as
      +the bootstrap entrypoint instead of starting from bundle exec kettle-jem.
    • +
    • Generated templating Gemfiles now resolve the local tree-sitter language pack
      +workspace fork from structuredmerge/vendor.
    • +
    • Generated Appraisals now use modern keyword hash syntax for the
      +appraisal2-rubocop plugin declaration.
    • Refreshed the generated codecov/codecov-action workflow pin and made
      workflow-pin specs validate immutable pin shape instead of exact live SHAs.
    • -
    • Gem templates and generated templating Gemfiles now require kettle-dev >= 2.2.8.
    • -
    • The packaged gemspec template now uses the same kettle-dev 2.2.8 floor as
      +
    • Refreshed generated workflow templates to pin actions/checkout to the
      +v7.0.0 release.
    • +
    • Gem templates and generated templating Gemfiles now require kettle-dev >= 2.2.12.
    • +
    • The packaged gemspec template now uses the same kettle-dev 2.2.12 floor as
      generated Gemfile tooling.
    • -
    • Generated templating Gemfiles now require kettle-drift >= 1.0.3.
    • -
    • Gem templates now require kettle-test >= 2.0.5.
    • +
    • Generated templating Gemfiles now require kettle-drift >= 1.0.4.
    • +
    • Gem templates now require kettle-test >= 2.0.8.
    • Generated coverage Gemfiles now require kettle-soup-cover >= 2.0.2.
    • Generated style Gemfiles now require rubocop-gradual >= 0.4.0.
    • Generated style Gemfiles now require appraisal2-rubocop >= 0.2.1.
    • @@ -112,9 +457,15 @@

      Changed

      instead of replacing it with the primary author token.
    • Retemplating now removes legacy .github/workflows/tests.yml files as
      obsolete workflows.
    • -
    • Runtime dependency token-resolver now requires 2.0.2 or newer.
    • -
    • Gem templates now require turbo_tests2 >= 3.1.3 for the default
      +
    • Runtime dependency token-resolver now requires 2.0.3 or newer.
    • +
    • Gem templates now require turbo_tests2 >= 3.1.6 for the default
      kettle-test runner dependency.
    • +
    • The README template now links kettle-readme-backers to the generated
      +bin/ binstub instead of a non-existent exe/ path.
    • +
    • The README template’s test matrix credit now highlights the Kettle dev/test
      +stack with BestGems, GitHub, and daily download rank links, excluding the
      +current gem from its own stack table.
    • +
    • The README dev/test stack table now includes kettle-soup-cover.
    • Documentation templates now require yard-yaml >= 0.2.1.
    • Gemfile and gemspec source checks now prefer Prism-backed call records instead
      of regex/string fallback matching for dependency and project-name decisions.
    • @@ -131,19 +482,26 @@

      Changed

      the peeled commit SHA for v6.0.3 and qltysh/qlty-action/coverage to the
      immutable SHA for v2.2.1.
    • Generated GitHub Actions workflow templates now refresh pins for
      -coverallsapp/github-action, codecov/codecov-action, and
      -kettle-rb/ts-grammar-action.
    • +coverallsapp/github-action and codecov/codecov-action. +
    • Generated templating and unlocked dependency workflows no longer install the
      +legacy tree-sitter action and rely on the packaged
      +tree_sitter_language_pack runtime instead.
    • +
    • Generated templating workflows and kettle-jem prepare now update nomono
      +before install/selftest commands run, so stale locks do not activate old
      +local-workspace wiring code.
    • Generated GitHub Actions workflow templates now refresh pins for
      github/codeql-action sub-actions to v4.36.2.
    • -
    • Generated workflow templates now pin coverallsapp/github-action,
      -codecov/codecov-action, and kettle-rb/ts-grammar-action to resolvable
      -release SHAs instead of stripped SemVer strings.
    • +
    • Generated workflow templates now pin coverallsapp/github-action and
      +codecov/codecov-action to resolvable release SHAs instead of stripped
      +SemVer strings.
    • +
    • Generated README badge URLs now use the same URI-normalized form as
      +kettle-pre-release, avoiding churn between encoded namespace separators
      +and Unicode badge messages.
    • Generated GitHub Actions workflow templates now refresh ruby/setup-ruby to
      the immutable SHA for v1.312.0 and codecov/codecov-action to the latest
      v7.0.0 release comment.
    • Generated GitHub Actions workflow templates now refresh ruby/setup-ruby,
      -coverallsapp/github-action, pozil/auto-assign-issue, and
      -kettle-rb/ts-grammar-action pins.
    • +coverallsapp/github-action, and pozil/auto-assign-issue pins.
    • Generated coverage workflows now publish QLTY coverage with GitHub OIDC so
      repositories do not require QLTY_COVERAGE_TOKEN to be configured.
    • Generated README and FUNDING OpenCollective links now use the configured
      @@ -199,12 +557,11 @@

      Changed

    • Documented rubygems.min_ruby in the generated .kettle-jem.yml so projects
      can make the published runtime Ruby floor explicit.
    • Documentation templates now require yard-yaml >= 0.2.0.
    • -
    • Documentation templates now require yard-fence >= 0.9.3.
    • +
    • Documentation templates now require yard-fence >= 0.9.4.
    • Documentation templates now require yard-timekeeper >= 0.2.1.
    • Gem templates and generated templating Gemfiles now require kettle-dev >= 2.1.1.
    • Gem templates now require kettle-test >= 2.0.3.
    • Gem templates now require appraisal2 >= 3.1.1.
    • -
    • Gem templates now require version_gem >= 1.1.11.
    • Generated templating Gemfiles now require kettle-drift >= 1.0.1.
    • Runtime dependency token-resolver now requires the released 2.x line.
    • Development lockfile generation now uses Bundler 4.0.12.
    • @@ -230,9 +587,9 @@

      Changed

      command config as well as managed .gitattributes, so local git diff
      can actually invoke StructuredMerge drivers after templating.
    • Runtime dependency token-resolver now requires 2.0.1 or newer.
    • -
    • Generated gemspecs now require version_gem >= 1.1.11 while allowing the
      +
    • Generated gemspecs now require version_gem >= 1.1.12 while allowing the
      released 1.1 line.
    • -
    • Gem templates now require gitmoji-regex >= 2.0.1.
    • +
    • Gem templates now require gitmoji-regex >= 2.0.2.
    • Gem templates now require turbo_tests2 >= 3.1.1 for the default
      kettle-test runner.
    • Generated style Gemfiles now use the latest released rubocop-ruby*
      @@ -241,21 +598,104 @@

      Changed

      constraints for every supported Ruby floor.
    • Generated style Gemfiles now treat style dependency floors as latest-Ruby
      task dependencies, independent from the gemspec runtime Ruby floor.
    • +
    • kettle-jem now requires kettle-rb >= 0.1.1.
    • Generated coverage Gemfiles now require kettle-soup-cover >= 2.0.1.
    • -
    - -

    Deprecated

    - -

    Removed

    - -

    Fixed

    - -
      +
    • +

      Generated documentation Gemfiles now require yaml-converter >= 0.2.1
      +while allowing the released 0.2 line.

      +
    • +
    • Generated root Gemfiles no longer path-wire direct sibling dependencies from
      +stale sibling directories whose gemspec defines a different gem name.
    • +
    • Generated root Gemfiles now remove previously generated direct sibling wiring
      +when the current sibling directory no longer defines the dependency gem.
    • +
    • Generated RuboCop configs now activate the rubocop-rspec plugin for the
      +packaged RSpec RuboCop overlay.
    • +
    • Gemspec spec.files merging now supports the generated Dir[...] + [...]
      +assignment shape on subsequent template runs instead of rejecting it as
      +unsupported.
    • +
    • Generated modular Gemfiles no longer redeclare runtime dependencies that are
      +already supplied by the project gemspec.
    • +
    • Existing generated gemspecs with splat-based spec.files assignments now
      +retain configured root license files from the template instead of preserving
      +the old splat-only assignment wholesale.
    • +
    • Gemspec spec.files templating now fails hard for unsupported package-list
      +shapes instead of silently preserving destination content.
    • +
    • Generated gemspecs now package active root license files declared by the
      +project license configuration.
    • +
    • Gemspec templating no longer preserves frozen spec.files override blocks;
      +spec.files is structurally merged so stale frozen package lists cannot
      +replace the merged package payload.
    • +
    • README template merging no longer duplicates preserved destination-only
      +subsections when they are already inside another preserved destination
      +section.
    • +
    • Generated gemspecs now add an inline Gemspec/RequiredRubyVersion RuboCop
      +disable when the published runtime Ruby floor is below 2.0.
    • +
    • +kettle-jem install no longer tries to switch the local RuboCop-LTS checkout
      +while templating the RuboCop-LTS checkout itself.
    • +
    • Generated style Gemfiles now require rubocop-ruby3_2 >= 3.0.6 so
      +Appraisal/RuboCop tasks do not select damaged packages missing
      +packaged RuboCop-LTS configuration files.
    • +
    • Gemspec spec.files merging now preserves Dir[...] glob expansion when
      +merging destination glob entries into an array-based template assignment by
      +generating concatenated Dir[...] + [...] package file expressions.
    • +
    • Quiet templating orchestration no longer passes unsupported --quiet
      +switches to Bundler subcommands such as bundle binstubs or bundle lock;
      +only Bundler subcommands documented with --quiet receive that flag.
    • +
    • Gemspec spec.files merging now inserts missing trailing commas when moving
      +existing collection entries before appended template entries, preventing
      +invalid Ruby when a destination’s former last entry had no comma.
    • +
    • Gemfile templating now preserves destination-only Ruby-bucket
      +eval_gemfile entries, preventing configured recording Gemfiles from being
      +dropped when the main Gemfile template is reapplied, and restores the main
      +recording Gemfile eval when existing Appraisals show recording is configured.
    • +
    • Generated templating Gemfiles no longer duplicate appraisal2-rubocop; the
      +Appraisal generator formatter is provided by the style Gemfile loaded from
      +Appraisal.root.gemfile.
    • +
    • Generated local Gemfile overrides now load nomono/bundler without activating
      +nomono’s runtime dependencies during Bundler Gemfile evaluation, and bundled
      +handoff no longer runs through the RubyGems kettle-jem wrapper.
    • +
    • Gemspec template merging now preserves chained squiggly heredoc assignments
      +such as spec.description = <<~DESC.strip instead of replacing only the
      +opener line.
    • +
    • Generated README post-processing now adds missing compatible JRuby 10.0 and
      +TruffleRuby 33.0 compatibility badges when the matching workflow files exist.
    • +
    • Shunted Gemfile generation no longer duplicates broad gemspec development
      +dependencies that already have explicit modular Gemfile compatibility
      +overrides, such as old-Ruby fork handling.
    • +
    • +kettle-jem install no longer fails a stale outer bootstrap commit step when
      +the bundled handoff already committed the generated changes.
    • +
    • Shim template discovery now recovers the package version from the git index
      +or HEAD when a previous failed run already replaced the working-tree
      +version file with replacement-gem aliases.
    • +
    • Shim profile version files now alias the replacement gem version constants
      +and compute the replacement version require path relative to the generated
      +shim version file, fixing nested require paths such as omniauth/jwt
      +shimming omniauth/jwt2.
    • +
    • +kettle-jem install now skips its bundled handoff when the destination bundle
      +does not include kettle-jem, allowing shim-only gems to finish templating.
    • +
    • Namespace discovery now detects nested module declarations in the public
      +entrypoint before falling back to a stale generated version namespace, and the
      +README namespace badge now uses the shield-safe namespace token.
    • +
    • OpenCollective template tokens now use .github/FUNDING.yml as a valid org
      +source, preventing empty https://opencollective.com//... README and
      +FUNDING links when destination env variables are not loaded.
    • +
    • Monorepo-root templating now uses the no-OpenCollective funding templates
      +when no OpenCollective slug is configured, preventing empty generated
      +OpenCollective badge URLs in root FUNDING.md files.
    • +
    • The kettle-jem CLI now refuses to run from the kettle-jem project root
      +against a different destination, so templating cannot silently use
      +kettle-jem’s own environment instead of the target repo’s environment.
    • Fixed bin/kettle-jem-workflow-pins so its synthetic workflow is valid YAML
      and child command failures include stdout diagnostics.
    • Fixed bin/kettle-jem-workflow-pins so sub-action updates reported under the
      parent action repository, such as github/codeql-action, update the full
      pinned action path instead of being silently counted as zero updates.
    • +
    • Fixed bin/kettle-jem-workflow-pins to default to the same broad upgrade
      +strategy used by family workflow pin maintenance, so minor action releases
      +such as ruby/setup-ruby are not missed by template pin refreshes.
    • README compatibility badge pruning now compares Ruby minor series so patch
      floors like >= 1.8.7 and >= 2.2.2 keep their matching minor badges.
    • Gemspec template summary and description tokens now strip an already-present
      @@ -474,7 +914,7 @@

      Fixed

      kettle-drift binstubs when they already exist from local/plugin installs
      without requiring unreleased kettle-drift in every generated gemspec.
    • Added kettle-drift to generated templating Gemfiles, resolved remotely in
      -templating mode and via KETTLE_RB_DEV locally, separate from the
      +templating mode and via KETTLE_DEV_DEV locally, separate from the
      STRUCTUREDMERGE_DEV StructuredMerge local gem set.
    • Refreshed generated README metadata blocks after template README merging so
      version-derived gemspec metadata such as source_code_uri does not stay stale.
    • @@ -543,9 +983,9 @@

      Added

    diff --git a/gems/kettle-jem/docs/file.CODE_OF_CONDUCT.html b/gems/kettle-jem/docs/file.CODE_OF_CONDUCT.html index 7c13f4c6d..b62cd772d 100644 --- a/gems/kettle-jem/docs/file.CODE_OF_CONDUCT.html +++ b/gems/kettle-jem/docs/file.CODE_OF_CONDUCT.html @@ -6,7 +6,7 @@ File: CODE_OF_CONDUCT - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -193,9 +193,9 @@

    Attribution

    diff --git a/gems/kettle-jem/docs/file.CONTRIBUTING.html b/gems/kettle-jem/docs/file.CONTRIBUTING.html index 54de481eb..0b586f32e 100644 --- a/gems/kettle-jem/docs/file.CONTRIBUTING.html +++ b/gems/kettle-jem/docs/file.CONTRIBUTING.html @@ -6,7 +6,7 @@ File: CONTRIBUTING - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -94,6 +94,22 @@

    Help out!

  • Announce it in the channel for this org in the Discord!
  • +

    Ruby engine CI branches

    + +

    Pull requests run MRI workflows by default. JRuby and TruffleRuby workflows are
    +available by branch naming convention so ordinary PRs do not spend CI time on
    +alternate Ruby engines.

    + +
      +
    • Use a branch named jruby/* to run JRuby workflows for a pull request.
    • +
    • Use a branch named truffleruby/* to run TruffleRuby workflows for a pull
      +request.
    • +
    • Use a branch named engines/* to run both JRuby and TruffleRuby workflows for
      +a pull request.
    • +
    + +

    Pushes to the default branch continue to run the configured engine workflows.

    +

    Executables vs Rake tasks

    Executables shipped by dependencies, such as kettle-dev, and stone_checksums, are available
    @@ -187,7 +203,7 @@

    Environment Variables for L
  • Git hosting forges generally ignore external diff drivers, so pull request views may still show raw textual diffs even when local git diff uses semantic drivers.
  • -
    K_JEM_TEMPLATING=true bundle exec kettle-jem install
    +
    K_JEM_TEMPLATING=true kettle-jem install
     

    Troubleshooting Git diffs

    @@ -195,7 +211,7 @@

    Environment Variables for L
  • Use git diff --no-ext-diff to compare against Git’s built-in diff output.
  • Use git diff --no-textconv when a textconv projection obscures the raw file bytes you need to inspect.
  • If Git reports a missing smorg-* executable, rerun bundle install and the setup command above, then check git config --local --get-regexp '^diff\.smorg-'.
  • -
  • To remove managed local entries, run K_JEM_TEMPLATING=true bundle exec kettle-jem install --undo; remove global command registrations with git config --global --unset-all diff.smorg-ruby.command.
  • +
  • To remove managed local entries, run K_JEM_TEMPLATING=true kettle-jem install --undo; remove global command registrations with git config --global --unset-all diff.smorg-rb.command, git config --global --unset-all merge.smorg-rb.driver, and git config --global --unset-all merge.smorg-rb.name.
  • For a quick starting point, this repository’s mise.toml defines the shared defaults, and .env.local can override them locally. Copy .env.local.example to .env.local, use KEY=value lines, and either activate mise in your shell or run commands through mise exec -C /path/to/project -- ....

    @@ -210,9 +226,12 @@

    Appraisals

    They are created and updated with the commands:

    -
    bin/rake appraisal:update
    +
    bin/rake appraisal:generate
     
    +

    Use bin/rake appraisal:update when you intentionally need to resolve fresh
    +appraisal locks.

    +

    If you need to reset all gemfiles/*.gemfile.lock files:

    bin/rake appraisal:reset
    @@ -357,9 +376,9 @@ 

    Manual process

    diff --git a/gems/kettle-jem/docs/file.FUNDING.html b/gems/kettle-jem/docs/file.FUNDING.html index ae82430b8..3ba9c344b 100644 --- a/gems/kettle-jem/docs/file.FUNDING.html +++ b/gems/kettle-jem/docs/file.FUNDING.html @@ -6,7 +6,7 @@ File: FUNDING - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -65,9 +65,9 @@

    Many paths lead to being a sponsor or a backer of this project. Are you on such a path?

    -

    Sponsor Me on Github Liberapay Goal Progress Donate on PayPal

    +

    OpenCollective Backers OpenCollective Sponsors Sponsor Me on Github Liberapay Goal Progress Donate on PayPal

    -

    Buy me a coffee Donate on Polar Donate to my FLOSS efforts at ko-fi.com Donate to my FLOSS efforts using Patreon

    +

    Buy me a coffee Donate to my FLOSS efforts at ko-fi.com

    @@ -86,7 +86,7 @@

    🤑 A request for help

    To say “thanks!” ☝️ Join the Discord or 👇️ send money.

    -

    Sponsor me on GitHub Sponsors 💌 Sponsor me on Liberapay 💌 Donate on PayPal

    +

    Sponsor galtzo-floss/kettle-jem on Open Source Collective 💌 Sponsor me on GitHub Sponsors 💌 Sponsor me on Liberapay 💌 Donate on PayPal

    Another Way to Support Open Source Software

    @@ -101,9 +101,9 @@

    Another Way to Support Open diff --git a/gems/kettle-jem/docs/file.IRP.html b/gems/kettle-jem/docs/file.IRP.html index 76d4f8561..752242a14 100644 --- a/gems/kettle-jem/docs/file.IRP.html +++ b/gems/kettle-jem/docs/file.IRP.html @@ -6,7 +6,7 @@ File: IRP - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -98,9 +98,9 @@

    Follow-up

    diff --git a/gems/kettle-jem/docs/file.LICENSE.html b/gems/kettle-jem/docs/file.LICENSE.html index 3e6abfc3d..e76e70211 100644 --- a/gems/kettle-jem/docs/file.LICENSE.html +++ b/gems/kettle-jem/docs/file.LICENSE.html @@ -6,7 +6,7 @@ File: LICENSE - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -79,9 +79,9 @@ diff --git a/gems/kettle-jem/docs/file.PolyForm-Small-Business-1.0.0.html b/gems/kettle-jem/docs/file.PolyForm-Small-Business-1.0.0.html index 9b7d22744..2069edc65 100644 --- a/gems/kettle-jem/docs/file.PolyForm-Small-Business-1.0.0.html +++ b/gems/kettle-jem/docs/file.PolyForm-Small-Business-1.0.0.html @@ -6,7 +6,7 @@ File: PolyForm-Small-Business-1.0.0 - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -185,9 +185,9 @@

    Definitions

    diff --git a/gems/kettle-jem/docs/file.README.html b/gems/kettle-jem/docs/file.README.html index 84e307286..02c30f4bd 100644 --- a/gems/kettle-jem/docs/file.README.html +++ b/gems/kettle-jem/docs/file.README.html @@ -6,7 +6,7 @@ File: README - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -71,12 +71,12 @@

    🔮 Kettle::Jem

    if ci_badges.map(&:color).all? { it == "green"} 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.

    -

    Sponsor Me on Github Liberapay Goal Progress Donate on PayPal Buy me a coffee Donate on Polar Donate at ko-fi.com

    +

    OpenCollective Backers OpenCollective Sponsors Sponsor Me on Github Liberapay Goal Progress Donate on PayPal Buy me a coffee Donate at ko-fi.com

    - 👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️ + 👣 How will this project approach the September 2025 hostile takeover of RubyGems? 🚑️ -I've summarized my thoughts in [this blog post](https://dev.to/galtzo/hostile-takeover-of-rubygems-my-thoughts-5hlo). +

    I’ve summarized my thoughts in this blog post.

    @@ -130,9 +130,7 @@

    💡 Info you can shake a stick at

    Works with MRI Ruby 4 -Ruby 4.0 Compat Ruby current Compat -Ruby current Compat
    Support & Community
    - - - - - - - - - - - - -
    🚚 Amazing test matrix was brought to you by🔎 appraisal2 🔎 and the color 💚 green 💚
    👟 Check it out!github.com/appraisal-rb/appraisal2
    +

    kettle-dev Logo by Aboling0, CC BY-SA 4.0

    + +

    The amazing test matrix is powered by the kettle-dev stack.

    + +
    + How kettle-dev manages complexity in tests + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GemSourceRoleDaily download rank
    appraisal2GitHubmulti-dependency Appraisal matrix generationDaily download rank for appraisal2
    appraisal2-rubocopGitHubRuboCop Appraisal generator integrationDaily download rank for appraisal2-rubocop
    kettle-devGitHubdevelopment, release, and CI workflow toolingDaily download rank for kettle-dev
    kettle-soup-coverGitHubSimpleCov coverage policy and reportingDaily download rank for kettle-soup-cover
    kettle-testGitHubstandard test runner and coverage harnessDaily download rank for kettle-test
    rubocop-ltsGitHubRuby-version-aware lintingDaily download rank for rubocop-lts
    turbo_tests2GitHubparallel test executionDaily download rank for turbo_tests2
    + +
    StructuredMerge package family @@ -381,13 +428,10 @@

    Full Configuration Reference

    domain: "example.com" # ENV override: KJ_AUTHOR_DOMAIN orcid: "0000-0000-0000-0000" # ENV override: KJ_AUTHOR_ORCID funding: - patreon: "username" # ENV override: KJ_FUNDING_PATREON kofi: "username" # ENV override: KJ_FUNDING_KOFI paypal: "username" # ENV override: KJ_FUNDING_PAYPAL buymeacoffee: "username" # ENV override: KJ_FUNDING_BUYMEACOFFEE - polar: "username" # ENV override: KJ_FUNDING_POLAR liberapay: "username" # ENV override: KJ_FUNDING_LIBERAPAY - issuehunt: "username" # ENV override: KJ_FUNDING_ISSUEHUNT social: mastodon: "username" # ENV override: KJ_SOCIAL_MASTODON bluesky: "user.bsky.social" # ENV override: KJ_SOCIAL_BLUESKY @@ -730,7 +774,7 @@

    Workflow-Specific Options

    (SHA-pinned action references) while destination wins for job configuration:

    # Template updates this SHA automatically:
    -uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10
    +uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
     
     # Your matrix customizations are preserved:
     matrix:
    @@ -909,8 +953,8 @@ 

    Workspace & Funding

    KETTLE_RB_DEVWorkspace root for local sibling gems. true = ~/src/kettle-rb; a path = that path; unset/false = released gems.KETTLE_DEV_DEVWorkspace root for local sibling gems. true = ~/src/my; a path = that path; unset/false = released gems.
    KETTLE_DEV_DEBUG OPENCOLLECTIVE_HANDLE Alternative to FUNDING_ORG for personal OpenCollective pages.
    KJ_FUNDING_PATREONPatreon handle for FUNDING.yml
    KJ_FUNDING_KOFI Ko-fi handle for FUNDING.yml KJ_FUNDING_BUYMEACOFFEE Buy Me a Coffee handle for funding links
    KJ_FUNDING_POLARPolar handle for funding links
    KJ_FUNDING_LIBERAPAY Liberapay handle for funding links
    KJ_FUNDING_ISSUEHUNTIssueHunt handle for funding links
    KJ_SOCIAL_MASTODON Mastodon handle for social/profile links Donate on PayPalDonate on Polar Sponsor Me on Github Liberapay Goal Progress  
    @@ -411,9 +411,9 @@

    Support & Funding Info

    diff --git a/gems/kettle-jem/docs/file.RUBOCOP.html b/gems/kettle-jem/docs/file.RUBOCOP.html index f3e16de87..f338cfca2 100644 --- a/gems/kettle-jem/docs/file.RUBOCOP.html +++ b/gems/kettle-jem/docs/file.RUBOCOP.html @@ -6,7 +6,7 @@ File: RUBOCOP - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -89,12 +89,14 @@

    Checking RuboCop Violations

    Understanding the Lock File

    -

    The .rubocop_gradual.lock file tracks all current RuboCop violations in the project. This allows the team to:

    +

    The .rubocop_gradual.lock file is a work list, not a permanent baseline. Every entry represents a style issue that should be resolved by either fixing the code or making an intentional exception explicit.

    + +

    This allows the team to:

      -
    1. Prevent new violations while gradually fixing existing ones
    2. +
    3. Prevent new violations while existing issues are handled deliberately
    4. Track progress on code style improvements
    5. -
    6. Ensure CI builds don’t fail due to pre-existing violations
    7. +
    8. Distinguish temporary work items from intentional project style exceptions

    Common Commands

    @@ -126,29 +128,30 @@

    Workflow

    1. Before submitting a PR, run bundle exec rake rubocop_gradual:autocorrect
      a. or just the default bundle exec rake, as autocorrection is a pre-requisite of the default task.
    2. -
    3. If there are new violations, either: +
    4. If there are violations, either:
      • Fix them in your code
      • -
      • Run bundle exec rake rubocop_gradual:force_update to update the lock file (only for violations you can’t fix immediately)
      • +
      • Normalize intentional deviations with an explicit config or inline exception
      • +
      • Run bundle exec rake rubocop_gradual:force_update only for temporary work items you cannot fix immediately
    5. Commit the updated .rubocop_gradual.lock file along with your changes
    -

    Never add inline RuboCop disables

    +

    Explicit Style Exceptions

    -

    Do not add inline rubocop:disable / rubocop:enable comments anywhere in the codebase (including specs, except when following the few existing rubocop:disable patterns for a rule already being disabled elsewhere in the code). We handle exceptions in two supported ways:

    +

    Do not treat .rubocop_gradual.lock as a baseline. Treat it as a list of work that must be fixed or normalized into the styleguide.

    -
      -
    • Permanent/structural exceptions: prefer adjusting the RuboCop configuration (e.g., in .rubocop.yml) to exclude a rule for a path or file pattern when it makes sense project-wide.
    • -
    • Temporary exceptions while improving code: record the current violations in .rubocop_gradual.lock via the gradual workflow: -
        -
      • -bundle exec rake rubocop_gradual:autocorrect (preferred; will autocorrect what it can and update the lock only if no new violations were introduced)
      • -
      • If needed, bundle exec rake rubocop_gradual:force_update (as a last resort when you cannot fix the newly reported violations immediately)
      • -
      -
    • -
    +

    Prefer this order:

    + +
      +
    1. Fix the code so it follows the configured styleguide.
    2. +
    3. For intentional project conventions, add the narrowest useful override in .rubocop.yml or .rubocop_rspec.yml.
    4. +
    5. For local intentional deviations, add a tightly scoped inline rubocop:disable / rubocop:enable around the exact line or block.
    6. +
    7. Keep an entry in .rubocop_gradual.lock only as temporary work to be resolved later.
    8. +
    + +

    Use configuration overrides when a deviation is structural, generated, path-specific, or applies consistently to a small set of files. Use inline disables when the exception is local and the reason is clearer at the code site than in global config.

    In general, treat the rules as guidance to follow; fix violations rather than ignore them. For example, RSpec conventions in this project expect described_class to be used in specs that target a specific class under test.

    @@ -156,16 +159,16 @@

    Benefits of rubocop_gradual

    • Allows incremental adoption of code style rules
    • -
    • Prevents CI failures due to pre-existing violations
    • -
    • Provides a clear record of code style debt
    • +
    • Prevents CI failures due to temporary pre-existing violations
    • +
    • Provides a clear work list of code style debt
    • Enables focused efforts on improving code quality over time
    diff --git a/gems/kettle-jem/docs/file.SECURITY.html b/gems/kettle-jem/docs/file.SECURITY.html index 7bebcdc30..cbcda8f97 100644 --- a/gems/kettle-jem/docs/file.SECURITY.html +++ b/gems/kettle-jem/docs/file.SECURITY.html @@ -6,7 +6,7 @@ File: SECURITY - — Documentation by YARD 0.9.44 + — Documentation by YARD 0.9.45 @@ -72,7 +72,7 @@

    Supported Versions

    7.0.latest7.1.latest